UIView上的固定高度约束

UIView上的固定高度约束,uiview,autolayout,Uiview,Autolayout,我有一个UIView在我的布局内,以做一些剪辑和分组,但自动布局时,缩小它的大小。我想给它一个固定的高度,但唯一的选择是设置顶部和底部空间 有没有办法设置明确的高度限制?试试这个 view.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexi

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

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

试试这个

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

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

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

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

从:

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

子类不应重写此方法

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

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

同样,从以下方面:

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


苹果强烈建议不要检查UIView之外的任何东西(比如获取超级视图的大小并调整它),因为AutoLayout并不是用于此目的的(并且可能会导致严重的问题)。

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

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

对于约束,您不需要4个约束(顶部、底部、左侧和右侧);你只需要2个:垂直和水平。其余部分通过自动布局进行计算


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

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

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

  • 在Interface Builder左侧的检查器中选择您的视图
  • 按住Ctrl键将一条线从视图拖到其自身
  • =>弹出一个弹出窗口,您可以在其中设置明确的高度和宽度限制。

    我刚刚找到了这个答案()。这就是我的实现的样子:

    - (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];
    }
    
    Swift代码


    他使用的是约束,而不是支柱和弹簧。它们是不可互换的。对我来说,这在组的顶级父视图上不起作用。没有弹出窗口出现。
    let heightConstraint = NSLayoutConstraint(item: yourView, 
                                          attribute: .Height, 
                                           relatedBy: .Equal, 
                                                 toItem: nil, 
                                  attribute: .NotAnAttribute, 
                                 multiplier: 1, constant: 80)//your desired height
    
    yourView.addConstraint(heightConstraint)