UIView上的固定高度约束

时间:2013-01-09 23:01:52

标签: uiview autolayout

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

有没有办法设置显式高度约束?

7 个答案:

答案 0 :(得分:5)

我刚刚找到了这个答案(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];
}

答案 1 :(得分:3)

  1. 在Interface Builder左侧的检查器中选择您的视图。
  2. Ctrl将视图中的一条线拖到自身。
  3. =>出现一个弹出框,您可以在其中设置显式的高度和宽度约束。

答案 2 :(得分:2)

是和否。在AutoLayout中,您无法为UIView的大小设置约束,但是您可以阻止UIView“压缩”超过其内在大小

这将有效地约束视图,同时避免让父视图强制子视图具有特定大小的危险(从而删除AutoLayout的'Auto'部分)。

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

来自Apple UIView Documentation

  

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

     

子类不应该覆盖此方法。

好的,现在我们知道如何指定一个优先级来避免我们的视图小于其内在大小,但我们如何设置内在大小?

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

再次,来自Apple UIView Documentation

  

自定义视图通常包含显示布局系统不知道的内容。覆盖此方法允许自定义视图根据其内容与布局系统进行通信。此内在大小必须独立于内容框架,因为例如,无法根据更改的高度动态地将更改的宽度传达给布局系统。

Apple 强烈建议不要检查UIView以外的任何内容(比如获取超级视图的大小并进行调整),因为这不是AutoLayout的用途(并且可能导致不良后果)

答案 3 :(得分:2)

eckyzero代码的快速代码。

let heightConstraint = NSLayoutConstraint(item: yourView, 
                                      attribute: .Height, 
                                       relatedBy: .Equal, 
                                             toItem: nil, 
                              attribute: .NotAnAttribute, 
                             multiplier: 1, constant: 80)//your desired height

yourView.addConstraint(heightConstraint)

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

您无需为其提供顶部空间和底部空间。如果您有超级视图底部的8个像素的底部约束,它将始终尝试调整子视图的大小以保持在超级视图内(取决于您是否设置了优先级)。

您可以将高度约束优先于底部空间约束,因此当它们发生冲突时,它将选择强制执行高度约束并忽略底部约束。

对于约束,您不需要4个约束(顶部,底部,左侧和右侧);你只需要2:垂直和水平。剩下的就是autolay out。

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

答案 6 :(得分:-4)

试试这个

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