我們的項目針對所有iPAD運行,並且我們遇到了一個問題,例如我們有8個按鈕垂直坐在屏幕上,約束被添加爲垂直間距,它們在iPAD 9.7英寸上看起來很好,但它們在iPAD 12.9上看起來非常大,所以問題是,是否有任何好方法可以更好地使用屏幕空間,比如在iPAD 12.9中添加額外的UIView。我已經考慮過使用大小類,但我相信所有iPAD都有一個大小類,我想要的是如果有一種方法可以使用「接口」構建器爲不同的iPAD大小創建不同的UI針對不同iPAD尺寸的不同用戶界面
回答
我想你的情況的方法是,這個特定的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屏幕。然後只需加載所需的屏幕,就好像它是一個完全不同的屏幕。
hey @Pochi,非常感謝答案,這是使用不同視圖的好方法。但是我所擁有的一個問題是,如果我按照自己的方式使用這個視圖,那麼這個視圖只需要一定的高度?我將如何做,而不是使用let screenRect:CGRect = UIScreen.main.bounds。如果我不給它一個高度會發生什麼?另外,我可以在故事板中使用這個UIView類嗎? –
第一個問題:沒有任何反應,只要它有適當的約束條件,它就會正確顯示。您需要指定一個位置(如中心x和y)以及視圖的大小。只要視圖中的所有元素都具有相對位置,您就不需要指定高度。只要確保頂層元素具有相對於視圖頂部的位置,然後相對於該最後一個元素位於頂層元素下方,直到最後一個元素具有相對於視圖底部的位置。這種方法的很大一部分是你可以在IB上進行設計。 – Pochi
第二個問題:是的。如果您使用我上面發佈的代碼,只需將UIView拖入界面構建器。然後將其設置爲您自定義視圖的一種類型。它應該自動顯示爲預覽。但請記住,對於Interface Builder(IB)來渲染視圖,它使用init?(coder aDecoder:NSCoder)方法中的代碼。並且由於那個人調用「loadViewFromNib」,那裏的條件將定義哪個XIB將被用作預覽。 – Pochi
假設您的筆尖是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]
只是把約束,因爲我建議如下看看Sample我已經爲你創造。
- 給你的按鈕長寬比。
- 給出的寬度等於父視圖的寬度。
- 在容器中水平添加約束中心並在容器中垂直居中。
- 選擇您的按鈕,然後轉到尺寸檢查器並設置寬度的乘數(如0.3或0.4等)。
- 然後設置「align center X to ..」的乘數(如果你希望你的按鈕位於中心左邊,那麼將乘數設置在1以下,比如0.8,0.7,0.5等等。如果你想讓你的按鈕位於右邊然後設置乘數值大於1像1.2等)。
- 步驟設置「居中y以..」倍增器的值作爲類似5
它全部搞定..只要運行和檢查。
希望這會幫助你。
嘗試這個
1.去除所有的按鈕限制
- 所有的按鈕添加到stackview您stackview
- 將垂直約束
- 設置相同的高度相同的寬度爲stackview按鈕
- 刪除高度,如果你的任何按鍵
- 不要爲棧設置高度設置查看您是否希望它在不同的設備上運行。
您可以使用此
所有按鈕內嵌到視圖,並設置其制約上海華。
- 請確保爲其添加縱橫比約束。
選擇所有按鈕和添加約束
- 相等的寬度,相等的高度,長寬比
可以使用自動版式此。您可以將長寬比基本高度分配給您的按鈕。請記住,可以將比率關係設置爲「等於」或「小於等於」。你可以使用這些而不是給出確切的約束。所以這會導致按鈕適應高度。然後在代碼中,您可以簡單地檢查是否有足夠的空間來繪製額外的uiview。這也將解決「看起來很大」的問題。
檢查IB這裏的截圖,看看有什麼我指的是: Click on 'Relation' to see these settings
- 1. 針對不同屏幕尺寸的不同佈局
- 2. XCode:針對不同設備尺寸的不同UI
- 3. 針對不同語言的不同尺寸
- 4. 不同尺寸
- 5. 用css對不同的屏幕尺寸指定不同的類
- 6. 不同人的罐子尺寸不同
- 7. 如何設計支持不同屏幕尺寸的Android界面?
- 8. CSS - 不同尺寸的按鈕對齊
- 9. 不同尺寸的結果
- 10. Flickr Json不同的尺寸
- 11. 有不同的行尺寸
- 12. 不同的屏幕尺寸
- 13. 不同的屏幕尺寸?
- 14. 不同尺寸的CSS
- 15. 針對不同窗口/屏幕尺寸的響應式網頁
- 16. 針對不同尺寸圖片的圖像優化
- 17. Android:針對不同屏幕尺寸的Spinners
- 18. Android的佈局歪斜針對不同屏幕尺寸
- 19. Android libgdx,針對不同屏幕尺寸的固定變量
- 20. 針對不同屏幕尺寸的Android UI佈局
- 21. 相同的表格,不同的尺寸?
- 22. 針對不同顯示器尺寸的Shiny webapp頁面的自動調整
- 23. 不同尺寸支持android?
- 24. 陣列不同尺寸
- 25. Pygame窗口不同尺寸
- 26. 比較不同尺寸
- 27. 建立與不同尺寸
- 28. 如何使不同尺寸
- 29. 變換使尺寸不同
- 30. 針對不同的客戶
你有UI的任何例子,你想達到什麼目的? –
這不是StackView應該做的嗎?檢查出來.. – Sti
你不需要添加UIView,你可以通過以適當的方式設置約束來實現你的目標。在設置視圖像關係,優先級,長寬比等內部有許多選項約束。 –