[英]iOS auto layout: how to design different layouts for iPad landscape and iPad portrait in Xcode storyboard?
[英]How to configure different layouts for Portrait and Landscape Orientations using Auto Layout?
我有一個像附加圖像的視圖
現在我添加約束,以便當方向更改為橫向時,視圖中的UITextview必須位於屏幕的右側。 在UItextview上,我添加了以下約束,
這些限制雖然顯示了一些關於ambugity的警告,但是我的工作也是如此。 以下是橫向模式的屏幕截圖。
我的問題是雖然UItextview被移動到右側,但是當它處於橫向模式時,我想從superview頂部獲得一些額外的寬度。 換句話說,我希望UITextview從現在處於橫向模式的位置稍微向下移動。 我正在考慮如何在IB中使用自動布局來做到這一點,我無法弄清楚如何做到這一點。
請給我任何建議。
您可以通過多種方式使用約束來完成此操作,但只有在IB中進行限制時,無法自動執行此操作。 通過在方法中使用乘數和常量值,constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:,您可以使用一個約束來計算縱向和橫向中的不同距離。 進行計算以找出用於這些值的內容是很痛苦的,所以我在NSLayoutConstraint上編寫了一個類別來做到這一點。 其中一種方法的一個例子是:
+(NSLayoutConstraint *)topConstraintForView:(UIView *)subview viewAttribute:(NSLayoutAttribute) att superview:(UIView *)superview portraitValue:(CGFloat)pValue landscapeValue:(CGFloat)lValue {
CGFloat multiplier = (pValue - lValue)/(superview.bounds.size.height - superview.bounds.size.width);
CGFloat constant = pValue - (superview.bounds.size.height * multiplier);
NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:att relatedBy:0 toItem:superview attribute:NSLayoutAttributeBottom multiplier:multiplier constant:constant];
NSLog(@"top coeffs: %f %f",multiplier,constant);
return con;
}
您使用這些方法的方法是在故事板中添加起始縱向約束,但在屬性檢查器中選中“占位符 - 在構建時刪除”框中的約束,然后在viewDidLoad中替換它,如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addConstraint:[NSLayoutConstraint topConstraintForView:self.textView viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:225 landscapeValue:50]];
}
這將根據設備的旋轉自動調整文本視圖的位置,而無需任何其他代碼。 您可能需要更改文本字段的寬度以使所有內容都適合 - 我將它們和視圖中的“獲取”標簽括起來,以便更輕松地將它們定位為一個組。 該視圖和文本視圖具有高度和寬度約束,以及視圖的頂部和左側,以及文本視圖的頂部和右側。 該類別還有調整其他約束的方法,可以在http://jmp.sh/b/S4exMJBWftlCeO5GybNO找到。
另一種方法是將IBOutlets用於你在IB中制作的約束,並在其中一個旋轉回調方法中調整它們(常量值),或者刪除一些並重新制作其他的約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.