簡體   English   中英

如何使用自動布局為縱向和橫向方向配置不同的布局?

[英]How to configure different layouts for Portrait and Landscape Orientations using Auto Layout?

我有一個像附加圖像的視圖

在此輸入圖像描述

現在我添加約束,以便當方向更改為橫向時,視圖中的UITextview必須位於屏幕的右側。 在UItextview上,我添加了以下約束,

  1. 尾隨空間:Superview
  2. 底部空間:Superview

這些限制雖然顯示了一些關於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.

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