2017-06-20 125 views
1

我們的項目針對所有iPAD運行,並且我們遇到了一個問題,例如我們有8個按鈕垂直坐在屏幕上,約束被添加爲垂直間距,它們在iPAD 9.7英寸上看起來很好,但它們在iPAD 12.9上看起來非常大,所以問題是,是否有任何好方法可以更好地使用屏幕空間,比如在iPAD 12.9中添加額外的UIView。我已經考慮過使用大小類,但我相信所有iPAD都有一個大小類,我想要的是如果有一種方法可以使用「接口」構建器爲不同的iPAD大小創建不同的UI針對不同iPAD尺寸的不同用戶界面

+0

你有UI的任何例子,你想達到什麼目的? –

+0

這不是StackView應該做的嗎?檢查出來.. – Sti

+0

你不需要添加UIView,你可以通過以適當的方式設置約束來實現你的目標。在設置視圖像關係,優先級,長寬比等內部有許多選項約束。 –

回答

3

我想你的情況的方法是,這個特定的ViewController有很多共同的東西,(像一個普通的頂欄,或導航欄),但只是中間的內容似乎並不適合正常。

在這種情況下,建議有一個自定義的UIView,它將根據當前設備的高度或寬度加載不同的xib文件。

這裏的關鍵是,你實際上只需要一個UIView子類。

爲此,您還可以使用@IBDesignable在界面構建器中實時預覽它。

要做到這一點,你必須按照下面的步驟。

1)根據尺寸爲每個「UIViews」創建一個.xib文件。

2)創建一個UIView子類。

3)將接口構建器的屬性掛鉤到這個子類。請注意,您必須爲您要使用的每個xib文件重複此過程。重要提示:儘管他們是不同的xibs,但他們都被吸引到同一個班級。

4)將創建的類標記爲@IBDesignable。

@IBDesignable class CustomView: UIView { 
    ... 
} 

5)在你的類裏面添加下面的代碼,根據你選擇的標準加載一個不同的xib。

////////// View Logic ////////// 

// Our custom view from the XIB file 
var view: UIView! 

func xibSetup() { 
    view = loadViewFromNib() 

    // use bounds not frame or it'll be offset 
    view.frame = bounds 

    // Make the view stretch with containing view 
    view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] 
    // Adding custom subview on top of our view (over any custom drawing > see note below) 
    addSubview(view) 
} 

func setup() 
{ 
    // Extra setup goes here 

} 

func loadViewFromNib() -> UIView { 

    let bundle = Bundle(for: type(of: self)) 

    let nib : UINib 

    let screenRect : CGRect = UIScreen.main.bounds; 

    // Use a different Nib based on the current screen height 

    if screenRect.size.height == 1024 { 
     // iPad Air & Pro 

     nib = UINib(nibName: "iPadNormal", bundle: bundle) 
    } 
    else if screenRect.size.height == 1366 { 
     // Large iPad Pro 

     nib = UINib(nibName: "iPadLarge", bundle: bundle) 
    } 
    else { 
     // Fall back 

     nib = UINib(nibName: "iPadFallback", bundle: bundle) 
    } 

    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView 

    return view 
} 


override init(frame: CGRect) { 
    // 1. setup any properties here 

    // 2. call super.init(frame:) 
    super.init(frame: frame) 

    // 3. Setup view from .xib file 
    xibSetup() 

    // 4. Other Setup 
    setup() 
} 

required init?(coder aDecoder: NSCoder) { 
    // 1. setup any properties here 

    // 2. call super.init(coder:) 
    super.init(coder: aDecoder) 

    // 3. Setup view from .xib file 
    xibSetup() 

    // 4. Other Setup 
    setup() 
} 


//////////////// 

重要:

這種方法只建議在使用自定義視圖的內容是相同的,或非常小的變化(佈局並不重要)。如果內容在大小之間變化很大(比如你實際上想顯示不同的東西),那麼你應該用你的共享邏輯創建一個「BaseViewController」,並且爲每個iPad Size創建一個子類,以便每個人都擁有自己的ViewController + Interface Builder屏幕。然後只需加載所需的屏幕,就好像它是一個完全不同的屏幕。

+0

hey @Pochi,非常感謝答案,這是使用不同視圖的好方法。但是我所擁有的一個問題是,如果我按照自己的方式使用這個視圖,那麼這個視圖只需要一定的高度?我將如何做,而不是使用let screenRect:CGRect = UIScreen.main.bounds。如果我不給它一個高度會發生什麼?另外,我可以在故事板中使用這個UIView類嗎? –

+0

第一個問題:沒有任何反應,只要它有適當的約束條件,它就會正確顯示。您需要指定一個位置(如中心x和y)以及視圖的大小。只要視圖中的所有元素都具有相對位置,您就不需要指定高度。只要確保頂層元素具有相對於視圖頂部的位置,然後相對於該最後一個元素位於頂層元素下方,直到最後一個元素具有相對於視圖底部的位置。這種方法的很大一部分是你可以在IB上進行設計。 – Pochi

+0

第二個問題:是的。如果您使用我上面發佈的代碼,只需將UIView拖入界面構建器。然後將其設置爲您自定義視圖的一種類型。它應該自動顯示爲預覽。但請記住,對於Interface Builder(IB)來渲染視圖,它使用init?(coder aDecoder:NSCoder)方法中的代碼。並且由於那個人調用「loadViewFromNib」,那裏的條件將定義哪個XIB將被用作預覽。 – Pochi

0

假設您的筆尖是Foo_pro.xib和Foo_ipad.xib。

@implementation Util 

+(BOOL) isIpad_1024 
{ 
    if ([UIScreen mainScreen].bounds.size.height == 1024) { 
     return YES; 
    } 
    return NO; 
} 

+(BOOL) isIpadPro_1366 
{ 
    if ([UIScreen mainScreen].bounds.size.height == 1366) { 
     return YES; 
    } 
    return NO; 
} 

+(NSString *)convertXib:(NSString *)nibName { 
    if([Util isiPadPro_1366]) { 
     return [NSString stringWithFormat:@"%@_pro", nibName]; 
    } else { 
     return [NSString stringWithFormat:@"%@_ipad", nibName]; 
    } 
} 

Foo *foo = [[Foo alloc] initWithNibName:[Util convertXib:@"Foo"] bundle:nil] 
0

只是把約束,因爲我建議如下看看Sample我已經爲你創造。

  1. 給你的按鈕長寬比。
  2. 給出的寬度等於父視圖的寬度。
  3. 在容器中水平添加約束中心並在容器中垂直居中。
  4. 選擇您的按鈕,然後轉到尺寸檢查器並設置寬度的乘數(如0.3或0.4等)。
  5. 然後設置「align center X to ..」的乘數(如果你希望你的按鈕位於中心左邊,那麼將乘數設置在1以下,比如0.8,0.7,0.5等等。如果你想讓你的按鈕位於右邊然後設置乘數值大於1像1.2等)。
  6. 步驟設置「居中y以..」倍增器的值作爲類似5

它全部搞定..只要運行和檢查。

希望這會幫助你。

0

嘗試這個

1.去除所有的按鈕限制

  • 所有的按鈕添加到stackview您stackview
  • 將垂直約束
  • 設置相同的高度相同的寬度爲stackview按鈕
  • 刪除高度,如果你的任何按鍵
  • 不要爲棧設置高度設置查看您是否希望它在不同的設備上運行。
  • 0

    您可以使用此

    所有按鈕內嵌到視圖,並設置其制約上海華。

    • 請確保爲其添加縱橫比約束。

    選擇所有按鈕和添加約束

    • 相等的寬度,相等的高度,長寬比
    0

    可以使用自動版式此。您可以將長寬比基本高度分配給您的按鈕。請記住,可以將比率關係設置爲「等於」或「小於等於」。你可以使用這些而不是給出確切的約束。所以這會導致按鈕適應高度。然後在代碼中,您可以簡單地檢查是否有足夠的空間來繪製額外的uiview。這也將解決「看起來很大」的問題。

    檢查IB這裏的截圖,看看有什麼我指的是: Click on 'Relation' to see these settings