NSLayoutConstraint并设置一个视图X像素从顶部纵向和Y像素从顶部横向

Pad*_*215 5 objective-c ios nslayoutconstraint

希望表格视图在纵向时从顶部向下显示300像素,在横向时从顶部向下显示约175像素.

我似乎无法弄清楚我需要的VFL逻辑.

Rob*_*Rob 10

像许多自动布局问题一样,是的,你可以做你所要求的,但它远非显而易见.如果我真的需要300pt或175pt,我也可能会想要调整旋转的顶部约束.

但是如果你想知道如何在不处理旋转事件的情况下做到这一点,你可以:

  1. 设置所需的最小上限为175;

  2. 设置较低优先级的首选上边距为300(在景观中不会满足); 和

  3. 不太明显的是,您还需要一个所需的最小高度(因此,在横向上,它将知道不满足较低优先级请求以使上边距300).

例如,您可以使用(显然将5的底部边距替换为对您有意义的任何内容,但相应地调整tableview的最小高度):

@"V:|-(>=175)-[tableView(>=120)]-5-|"
Run Code Online (Sandbox Code Playgroud)

结合:

@"V:|-(300@500)-[tableView]"
Run Code Online (Sandbox Code Playgroud)

(显然,你也会对水平轴有约束,但为了简洁起见,我省略了它们.)

不可否认,这也是非常缺乏吸引力的,必须精确地指定最小桌面高度,但我没有看到任何其他方式告诉autolayout在什么情况下它应该优雅地不满足300pt的可选顶部空间.


您也可以使用y = mx + b公式来完成此操作constraintWithItem.是的,我知道你问过如何使用Visual Format Language进行此操作,但如果使用constraintWithItem,则不必指定最小表高度,而是可以像这样设置上边距:

constraint = [NSLayoutConstraint constraintWithItem:self.tableView
                                          attribute:NSLayoutAttributeTop
                                          relatedBy:NSLayoutRelationEqual
                                             toItem:self.tableView.superview
                                          attribute:NSLayoutAttributeBottom
                                         multiplier:multiplier
                                           constant:constant];
Run Code Online (Sandbox Code Playgroud)

显然,诀窍在于如何确定multiplier,constant以便你可以获得300 pt的纵向和175 pt的景观.做一个小代数,你会发现你可以按如下方式计算这些值:

CGFloat multiplier = (300.0 - 175.0) / (superviewPortraitHeight - superviewLandscapeHeight);
CGFloat constant = 175.0 - superviewLandscapeHeight * multiplier;
Run Code Online (Sandbox Code Playgroud)

(而且,我再次假设您将指定其他约束,以便不明确定义tableview,例如设置左,右和底部约束,这可以在Visual Format Language中完成.)