想要一个表格视图在纵向时从顶部向下显示 300 像素,而在横向时从顶部显示大约 175 像素。
我似乎无法弄清楚我需要的 VFL 逻辑。
想要一个表格视图在纵向时从顶部向下显示 300 像素,而在横向时从顶部显示大约 175 像素。
我似乎无法弄清楚我需要的 VFL 逻辑。
像许多自动布局问题一样,是的,您可以按照您的要求做,但这远非显而易见。如果我真的需要精确的 300pt 或 175pt,我也可能会想调整旋转的顶部约束。
但是,如果您想知道如何在不处理轮换事件的情况下执行此操作,您可以:
设置所需的最小上边距 175;
设置较低优先级的首选上边距 300(横向不会满足);和
不太明显,您还需要一个所需的最小高度(这样在横向中,它会知道不满足较低优先级的请求以使上边距为 300)。
例如,您可以使用(显然用对您有意义的任何内容替换我的底部边距 5,但相应地调整 tableview 的最小高度):
@"V:|-(>=175)-[tableView(>=120)]-5-|"
结合:
@"V:|-(300@500)-[tableView]"
(显然,水平轴也会受到限制,但为了简洁起见,我省略了这些限制。)
诚然,这有点不吸引人,也必须精确地指定最小表格高度,但我没有其他方法可以告诉自动布局在什么情况下它应该优雅地不满足可选的 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];
显然,诀窍是如何确定multiplier
和constant
以便您获得 300 pt 纵向和 175 pt 横向。做一点代数,你会发现你可以计算这些值如下:
CGFloat multiplier = (300.0 - 175.0) / (superviewPortraitHeight - superviewLandscapeHeight);
CGFloat constant = 175.0 - superviewLandscapeHeight * multiplier;
(同样,我假设您将指定其他约束,以便不会对 tableview 进行模糊定义,例如设置左侧、右侧和底部约束,这可以在可视格式语言中完成。)
我不认为无论如何都可以将其设置为执行特定距离,而无需在旋转回调方法中的代码中更改它。如果您为 IB 中的约束创建一个 IBOutlet(我们称之为 con1),并且该约束的初始值为 300,那么在旋转回调方法中您可以更改该常量。
self.con1.constant = 175;
编辑后:
这有效:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
con1.constant = 175;
}else{
con1.constant = 300;
}
}