我的布局中有一个 UIView 以便进行一些剪辑和分组,但是自动布局在缩小时会调整它的大小。我想给它一个固定的高度,但唯一的选择是设置顶部和底部空间。
有没有办法设置明确的高度约束?
我的布局中有一个 UIView 以便进行一些剪辑和分组,但是自动布局在缩小时会调整它的大小。我想给它一个固定的高度,但唯一的选择是设置顶部和底部空间。
有没有办法设置明确的高度约束?
我刚刚找到了这个答案(自动布局约束:调整大小时如何使视图保持其宽度/高度比?)。这就是我的实现的样子:
- (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 中,您不能为 UIView 的大小设置约束,但是您可以防止 UIView 被“压缩”超过其固有大小。
这将有效地约束视图,同时避免让父视图强制子视图具有一定大小的危险(从而删除 AutoLayout 的“自动”部分)。
要设置这些优先级,请使用:setContentCompressionResistancePriority:forAxis:
自定义视图应在创建时根据其内容为两个方向设置默认值,通常为 NSLayoutPriorityDefaultLow 或 NSLayoutPriorityDefaultHigh。在创建用户界面时,当整体布局设计需要与界面中使用的视图的自然优先级不同的权衡时,布局设计者可以为特定视图修改这些优先级。
子类不应覆盖此方法。
好的,现在我们知道如何分配优先级以避免我们的视图变得小于其固有大小,但是我们如何设置固有大小呢?
好吧,如果您使用的是标准 UI 元素,那么您已经设置好了!但是,如果您的 UIView 是自定义的,您将需要覆盖- (CGSize)intrinsicContentSize
以返回正确的大小。在这里,您可以测量视图必须计算正确尺寸的任何子视图 - 或者如果您使用的是艺术品/恒定大小的元素,您可以返回一个硬编码的值。
同样,来自AppleUIView
文档:
自定义视图通常会显示布局系统不知道的内容。覆盖此方法允许自定义视图根据其内容与布局系统通信它想要的大小。这个固有尺寸必须独立于内容框架,因为例如,无法根据改变的高度动态地将改变的宽度传达给布局系统。
Apple强烈建议不要检查 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;