我在布局中有一个UIView,用于进行剪切和分组,但是当缩小时,自动布局会将其调整大小。我想给它一个固定的高度,但唯一的选项是设置顶部和底部间距。
有没有一种方法可以设置显式高度约束?
我在布局中有一个UIView,用于进行剪切和分组,但是当缩小时,自动布局会将其调整大小。我想给它一个固定的高度,但唯一的选项是设置顶部和底部间距。
有没有一种方法可以设置显式高度约束?
我刚找到了这个答案 (Auto-Layout约束: 如何在调整大小时使视图保持其宽度/高度比?)。这是我的实现:
- (void)awakeFromNib
{
[super awakeFromNib];
NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:self.frame.size.height];
[self addConstraint:con1];
}
=> 弹出一个窗口,您可以在其中设置明确的高度和宽度约束。
这将有效地限制视图,同时避免父视图强制子视图成为特定大小的危险(从而删除“AutoLayout”的“Auto”部分)。
要设置这些优先级,您可以使用:setContentCompressionResistancePriority:forAxis:
来自{{link1:苹果UIView
文档}}:
创建自定义视图时,应基于其内容在创建时为两个方向设置默认值,通常为NSLayoutPriorityDefaultLow或NSLayoutPriorityDefaultHigh。创建用户界面时,布局设计人员可以在整体布局设计需要与界面中使用的视图的自然优先级不同的情况下修改这些优先级。
子类不应覆盖此方法。
好的,现在我们知道如何分配优先级以避免视图变小于其内在大小,但是如何设置内在大小呢?
如果您正在使用标准UI元素,则已经设置好了!但是,如果您的UIView是自定义的,则需要重写- (CGSize)intrinsicContentSize
以返回正确的大小。在这里,您可以测量该视图具有的任何子视图,以计算正确的尺寸 - 或者如果您使用艺术品/常量大小的元素,则可以返回硬编码值。
同样来自Apple UIView
Documentation:
自定义视图通常具有它们显示的内容,布局系统不知道。覆盖此方法允许自定义视图根据其内容向布局系统通信它希望基于其内容的大小。这种固有大小必须独立于内容框架,因为无法根据高度的更改动态地将更改的宽度通信给布局系统,例如。
苹果公司强烈建议不要检查UIView之外的任何内容(例如获取超级视图的大小并进行微调),因为这不是AutoLayout的用途(并且可能会在以后引起头痛)。
eckyzero代码的Swift代码。
let heightConstraint = NSLayoutConstraint(item: yourView,
attribute: .Height,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1, constant: 80)//your desired height
yourView.addConstraint(heightConstraint)
是的,您可以给它一个固定的高度。
您需要在每个维度上指定至少两个约束条件,因此在添加固定高度约束条件之前,无法删除顶部或底部空间。在IB中,选择您的视图,然后在视图编辑器的右下角有一个带有三个图标的按钮,按下中间的图标并选择“高度”。这将添加高度约束条件。现在,您可以删除底部或顶部空间,并且如果需要,在大小检查器中单击其即可编辑高度约束条件。
你不需要给它顶部和底部留空间。如果你有一个距离父视图底部8像素的底部约束,它将始终尝试调整子视图大小以保持在超级视图内(取决于你设置的优先级)。
你可以给高度约束一个比底部空间约束更高的优先级,这样当它们冲突时,它会选择执行高度约束并忽略底部约束。
对于约束,你不需要4个约束(上、下、左、右);你只需要2个:垂直和水平。其余的由自动布局计算得出。
只需删除底部约束,子视图就应该被裁剪了。
试一下这个
view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;