[英]iPad/iPhone multiple orientations best practice?
我想將我的觀點轉換為適合任何方向的工作(特別是因為它推薦用於iPad)。 我一直在使用IB來解決問題,我不確定如何最好地繼續下去。
我理想的是在IB中旋轉視圖,重做布局,並將兩個方向保存到同一個XIB,以便視圖自動知道方向更改時要做什么。 這似乎不可能。
我知道當方向改變時我可以在代碼中重新排列視圖,但是使用IB沒有多大意義,因為我的一個主要優點就是將所有丑陋的布局代碼從我的邏輯中分離出來。
其他人為此做了什么? 他們只是設計他們的視圖,以便UIViewAutoResizing標志可以適當地處理旋轉嗎? 他們是否有針對每個方向的多個視圖,並以某種方式平滑地切換它們?
您可以在同一個XIB中創建兩個單獨的視圖,然后實現以下代碼:
到@interface
IBOutlet UIView *landscapeView;
IBOutlet UIView *portraitView;
和@implementation
- (void) viewDidLoad {
self.view.frame = [[UIScreen mainScreen] applicationFrame];
landscapeView.autoresizesSubviews = NO; <- IMPORTANT!
portraitView.autoresizesSubviews = NO; <- IMPORTANT!
}
- (BOOL)shouldAutorotateToInt .... {
if ((interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight) self.view = landscapeView;
else if ((interfaceOrientation == UIInterfaceOrientationPortrait) || (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) self.view = portraitView;
return YES;
}
我在這里(以及關於這個主題的StackOverFlow上的其他地方)找到了這些信息,它讓我想到了我以前的答案。 如果你有很多頂級對象,這只會很繁瑣。
然后,我想到你可以創建一個“幫助”對象,所以我創建了一個項目來演示該技術。 基本上,幫助者在視圖中具有針對每個感興趣對象的出口。 ViewController本身有兩個Helper對象(一個用於p,一個用於l),你可以在NIB中實例化它們。 在方向更改時,將視圖控制器的幫助程序指針切換到相應的幫助程序,然后更新self.view。 它非常簡單(這篇文章更難)。
那么,你會如何開始? 如果您事先知道需要兩個單獨的視圖,那么它會有所幫助。 一旦您知道,請在下面引用的項目中使用Helper模板,進行調整,將其添加到NIB,然后將幫助連接到縱向視圖中的相應對象。 View Controller本身只是對兩個助手的引用,以及一個“curHelper”指針。 Helper ivars是公共的,因此View Controller可以引用諸如“curHelper-> label1.text = ...之類的項目 - 成本是單指針解除引用(也可以只使用屬性 - 您的調用)。
此外,您可以在任一視圖中直接連接來自對象的IBActions。 所以,讓我們來看看:
顯然你需要從現在起進行重復更改,但在任何雙筆尖方案中你都必須這樣做。 在上述技術中,所有插座名稱保持不變。
視圖控制器需要在接收到它時向兩個助手發送“viewDidUnload”,並釋放助手(然后釋放他們的出口)。
注意:我只是將它們放在一起看看它看起來如何。 如果你想看到代碼和一個非常小的演示,你可以從名為Helpers.zip的iPhone文件夾中的public dot me dot com slash dhoerl下載它。 如果需要,我會更新此文本和此文本。
查看上面的代碼,使用兩個視圖 - 我喜歡它。 為了回應“現在我必須保留兩個參考文獻 - 好吧,沒有一個解決方法 - 使用”參考“(我的術語)。
使用l和p的前綴命名視圖和出口,然后使用您現在使用的基本名稱定義“偽”ivars。 當您第一次viewDidLoad(或其他地方)時,將所有“偽”ivars設置為l或p varient。 切換方向時,只需將偽方向設置為另一方向(以及其他操作)。
在viewDidUnload和dealloc中,只引用l和p項 - “真正的”IBOutlets - 並簡單地將偽ivars取出。 讓它更難看 - l_no_no_no_或真正的IBOutlets前面的東西,所以你不要無意中使用它。
如果您制作偽ivars屬性,請使用ASSIGN而不是RETAIN!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.