修复了 UIView 的高度限制

Posted

技术标签:

【中文标题】修复了 UIView 的高度限制【英文标题】:Fixed height constraint on UIView 【发布时间】:2013-01-09 23:01:52 【问题描述】:

我的布局中有一个 UIView 以便进行一些剪辑和分组,但是自动布局在缩小时会调整它的大小。我想给它一个固定的高度,但唯一的选择是设置顶部和底部空间。

有没有办法设置明确的高度限制?

【问题讨论】:

【参考方案1】:

我刚刚找到了这个答案 (Auto-Layout Constraint: How to make a view maintains its width/height ratio when resized?)。这是我的实现的样子:

- (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];

【讨论】:

【参考方案2】:

是和否。在 AutoLayout 中,您不能为 UIView 的大小设置约束,但是您可以防止 UIView 被“压缩”超过其固有大小

这将有效地限制视图,同时避免父视图强制子视图具有特定大小的危险(从而删除 AutoLayout 的“自动”部分)。

要设置这些优先级,请使用:setContentCompressionResistancePriority:forAxis:

来自Apple UIView Documentation:

自定义视图应在创建时根据其内容为两个方向设置默认值,通常为 NSLayoutPriorityDefaultLow 或 NSLayoutPriorityDefaultHigh。在创建用户界面时,当整体布局设计需要与界面中使用的视图的自然优先级不同的权衡时,布局设计人员可以针对特定视图修改这些优先级。

子类不应覆盖此方法。

好的,现在我们知道如何分配优先级以避免我们的视图变得小于其固有大小,但是我们如何设置固有大小?

好吧,如果您使用的是标准 UI 元素,那么您已经准备好了!但是,如果您的 UIView 是自定义的,您将需要覆盖 - (CGSize)intrinsicContentSize 以返回正确的大小。在这里,您可以测量视图必须计算正确尺寸的任何子视图 - 或者如果您使用艺术品/恒定大小的元素,您可以返回硬编码值。

再次,来自Apple UIView Documentation:

自定义视图通常会显示布局系统不知道的内容。覆盖此方法允许自定义视图根据其内容与布局系统通信它想要的大小。这种固有尺寸必须独立于内容框架,因为例如,无法根据更改的高度将更改的宽度动态传达给布局系统。

Apple强烈 建议不要检查 UIView 之外的任何内容(例如获取超级视图的大小并对其进行调整),因为这不是 AutoLayout 的用途(并且可能会在未来引起严重的头痛) .

【讨论】:

【参考方案3】:
    在 Interface Builder 左侧的 Inspector 中选择您的视图。 Ctrl 将一条线从视图拖到自身。

=> 会出现一个弹出框,您可以在其中设置明确的高度和宽度限制。

【讨论】:

对我来说,这不适用于组的***父 UIView。没有弹出窗口出现。【参考方案4】:

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)

【讨论】:

【参考方案5】:

是的,你可以给它一个固定的高度。

您需要在每个维度中至少指定两个约束,因此在添加固定高度约束之前,您不能删除顶部或底部空间。在 IB 中,选择您的视图,然后在视图编辑器的右下方有一个带有三个图标的按钮,按中间的一个并选择“高度”。这增加了高度约束。现在您可以删除底部或顶部空间,如果需要,您可以通过在尺寸检查器中单击来编辑高度约束。

【讨论】:

【参考方案6】:

你不需要给它一个顶部空间和底部空间。如果您有一个距离父视图底部 8 像素的底部约束,它将始终尝试调整子视图的大小以保持在父视图内(取决于您是否设置了优先级)。

你可以给高度限制一个比底部空间限制更高的优先级,所以当它们发生冲突时,它会选择强制执行高度限制并忽略底部限制。

对于约束,你不需要 4 个约束(上、下、左、右);您只需要 2 个:垂直和水平。其余部分由自动布局计算。

只要移除底部约束,子视图就会被剪裁。

【讨论】:

【参考方案7】:

试试这个

view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

【讨论】:

他使用的是约束,而不是支柱和弹簧。它们不可互换。

以上是关于修复了 UIView 的高度限制的主要内容,如果未能解决你的问题,请参考以下文章

在情节提要 IOS 7 中根据屏幕宽度和高度修复两个 uiview 大小

AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?

UIView 内的 StackView - 自动高度

Swift - 具有零高度约束的 UIView - 错误

扩展 UIView 高度 (Swift)

在关闭自动布局的情况下更改 UIView 的高度