簡體   English   中英

輪換后在視圖中重組元素的最佳方法是什么?

[英]What's the best way to reorganize elements in a view after rotation?

我有一個子視圖(除了其他標准的Cocoa Touch控件),里面有6個按鈕和標簽。

在此輸入圖像描述

我正在使用這個凌亂的代碼在旋轉事件上旋轉和調整這些按鈕和標簽的大小。

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation {
    if (UIInterfaceOrientationIsPortrait(orientation)) {
        button1.frame = CGRectMake(20, 59, 130, 80);
        button2.frame = CGRectMake(170, 59, 130, 80);
        button3.frame = CGRectMake(20, 176, 130, 80);
        button4.frame = CGRectMake(170, 176, 130, 80);
        button5.frame = CGRectMake(20, 293, 130, 80);
        button6.frame = CGRectMake(170, 293, 130, 80);

        label1.frame  = CGRectMake(20, 147, 130, 21);
        label2.frame  = CGRectMake(170, 147, 130, 21);
        label3.frame  = CGRectMake(20, 264, 130, 21);
        label4.frame  = CGRectMake(170, 264, 130, 21);
        label5.frame  = CGRectMake(20, 381, 130, 21);
        label6.frame  = CGRectMake(170, 381, 130, 21);
    } else {
        button1.frame = CGRectMake(20, 59, 130, 60);
        button2.frame = CGRectMake(20, 155, 130, 60);
        button3.frame = CGRectMake(177, 59, 130, 60);
        button4.frame = CGRectMake(177, 155, 130, 60);
        button5.frame = CGRectMake(328, 59, 130, 60);
        button6.frame = CGRectMake(328, 155, 130, 60);

        label1.frame  = CGRectMake(20, 127, 130, 21);
        label2.frame  = CGRectMake(20, 223, 130, 21);
        label3.frame  = CGRectMake(177, 127, 130, 21);
        label4.frame  = CGRectMake(177, 223, 130, 21);
        label5.frame  = CGRectMake(328, 127, 130, 21);
        label6.frame  = CGRectMake(328, 223, 130, 21);
    }
}

這有點亂, 但工作正常,我可以精確控制視圖中的元素位置

在此輸入圖像描述

順便說一下,我想知道是否有兩個不同的視圖並且在旋轉時翻轉它們對於“cpu power”和內存消耗更有效 (我認為單個視圖而不是兩個視圖對內存更好,但我可能錯了,我是ios編程的新手。

謝謝你的任何建議!

現在我正在編寫你寫的類似代碼。 這個項目非常大,很難遵循哪里修改。 它是為iOS 3編寫的,現在客戶端需要進行一些修改。 問題不會那么大,如果iOS不會改變pushModal並且在iOS6中會被棄用......在我的情況下需要重寫GUI骨架,並且我有Portait / Landscape要求。 如果您願意,請查看幾個鏈接: question1 question2 question3 question4

對於不可預見的iOS更改,將難以概述該代碼,尤其是2年后。 我不會重復曾經工作過的程序員錯誤。

在你的情況下,我會選擇不同的解決方案(但肯定不是這樣):

解決方案1:為橫向和肖像創建不同的xib。 具有模塊化的優點:如果您因各種原因不需要Landscape,則很容易從代碼中取消鏈接。 缺點是創建一個新視圖(它可以被緩存)但仍然是不同的對象,需要在model-View2-controller之間同步數據。

解決方案2:僅使用1個xib文件並通過在大小檢查器(第5個選項卡)中設置它們的屬性來自動布局組件。 很難配置

解決方案3:在xib文件內部創建組件 - 橫向並將這些組件布局到預期的設計,大小,並在運行時讀取它們的大小並設置它,就像現在一樣,但可以直觀地進行編輯。

故事板或xib,對我來說幾乎是一樣的,可以有2個UIViewController和pop / push the Portait / Landscape來不用旋轉填充堆棧:)

速度ofc它是最好的,如果你根本不旋轉,但如果你仍然想要,也許2 xib中的2個組件,因為不需要改變2-4次的可見性,這將觸發很多od函數調用: viewwillappear,wiewdidapear,viewwilldisapers等。

你問:

順便說一下,我想知道是否有兩個不同的視圖並且在旋轉時翻轉它們對於“cpu power”和內存消耗更有效...

我相信情況正好相反。 viewWillLayoutSubviews簡單地調用你的方法的單個視圖效率要高得多(在iOS 5中,在iOS 4中我通常使用willAnimateRotationToInterfaceOrientation )。 效率提升是適度的,但如果效率是你的目標,我認為單一觀點是要走的路。 如果它們完全不同,您可能希望使用單獨的視圖,因此您的代碼將難以通過單個視圖進行管理,但除此之外我堅持使用一個視圖。 就個人而言,我也認為這是一個更強大的用戶界面,可以在旋轉設備時將控件設置為動畫。

就個人而言,當我有內容重新組織這樣的方向變化時,我試圖避免使用硬編碼坐標,而是使用視圖的尺寸來算法確定我的控件的布局(例如,每行多少)和來自在那里,確定他們的坐標。 通過這種方式,它不僅可以處理橫向與縱向,還可以使Universal應用程序(特別是如果將來還有其他具有不同屏幕尺寸的設備)更容易。 我想我們也可以期待iOS 6也提供了一些很好的增強功能來設置控件(盡管我們會在開發需要iOS 6的應用程序之前感覺很舒服)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM