AutoLayout---Interface Builder

本文详细介绍了AutoLayout的概念及其与AutoresizingMask的区别,提供了AutoLayout的基本使用方法,包括在Interface Builder中的配置及如何处理布局中出现的警告与错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接 

http://blog.youkuaiyun.com/meegomeego/article/details/39991057

http://blog.youkuaiyun.com/yongyinmg/article/details/39315821

http://www.onevcat.com/2012/09/autoayout/

http://blog.youkuaiyun.com/mozixiong/article/details/14165391

http://constraints.icodeforlove.com/


AutoLayout是什么?

AutoLayout是一种基于约束的,描述性的布局系统。 Auto Layout Is a Constraint-Based, Descriptive Layout System.

AutoLayout和Autoresizing Mask的区别

Autoresizing Mask是AutoLayout的子集,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成。AutoLayout还具备一些Autoresizing Mask不具备的优良特性,以帮助我们更方便地构建界面。

AutoLayout基本使用方法

Interface Builder

先介绍一点基本设置:

(1)如果不是iphone和ipad一起做的话 use Size classes 一般我都不勾

(2)


  • Content Hugging Priority(内容压缩优先级)
  • Content Compression Resistance Priority(内容抗压缩优先级)

static constUILayoutPriority UILayoutPriorityRequired 

static constUILayoutPriority UILayoutPriorityDefaultHigh 

static constUILayoutPriority UILayoutPriorityDefaultLow 

static constUILayoutPriority UILayoutPriorityFittingSizeLevel 

Greater/Less 一般与 Priority 一起使用,为一个 Constraint 设置了 Greater/Less 后,调整 Priority。如果 Constraint 的 Priority 的值越大,程序优先设置它的 Constraint 效果。

如果 Constraint 发生冲突时,会先找优先级高的UIView,满足优先级高的UIView 的Constraint 后再依次找优先级低的 Constraint 满足,最后改变 View 的 Frame。如果发生多个 Constraint不能同时满足的情况,就发生了Unsatisfiable Constraints的错误。

UIView中关于Content Hugging 和 Content Compression Resistance的方法有:

- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis

- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis

- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis

- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis


intrinsicContentSize

通俗的讲,具有intrinsic content size的控件自己知道(可以计算)自己的大小,例如一个label,当你设置text,font之后,其大小是可以计算到的。关于intrinsic content size官方的解释:

Custom views typically have content that they display of which the layout system is unaware. Overriding this method allows a custom view to communicate to the layout system what size it would like to be based on its content. This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.

截个constrait的图


Relation 选项分别表示大于/等于/小于 指的是2个view之间的关系

Constant表示当前控件相对于SuperView的x/y的相对距离

Priority表示优先级 


在哪里设置限制呢


或者是Editor--Pin

Interface Builder如何限制


一般来说只要把自己的大小和位置相对固定了就不会有问题了

接下来说说一些例子

(1)UILabel
UILabel会根据label.text的内容和字体自己算 如果numberOfLine = 1的话,label会自己去算长度。

所以只需要2条限制即可

如果numberOfLine = 0的话,就看你自己要自适应宽度还是自适应高度。

其他的比如UIButton,UIView
都要限制到足够固定这个控件的位置和大小

一些警告处理

修改了控件的位置或大小 你就可以通过这边来更新限制或者更新frame

等到都限制好了可以先preview一下  每次运行真的好慢啊


容易出现的错误

因为涉及约束问题,因此约束模型下的所有可能出现的问题这里都会出现,具体来说包括两种:

  • Ambiguous Layout 布局不能确定
  • Unsatisfiable Constraints 无法满足约束

布局不能确定指的是给出的约束条件无法唯一确定一种布局,也即约束条件不足,无法得到唯一的布局结果。这种情况一般添加一些必要的约束或者调整优先级可以解决。无法满足约束的问题来源是有约束条件互相冲突,因此无法同时满足,需要删掉一些约束。两种错误在出现时均会导致布局的不稳定和错误,Ambiguous可以被容忍并且选择一种可行布局呈现在UI上,Unsatisfiable的话会无法得到UI布局并报错。

对于不能确定的布局,可以通过调试时暂停程序,在debugger中输入

  • po [[UIWindow keyWindow] _autolayoutTrace]

来检查是否存在Ambiguous Layout以及存在的位置,来帮助添加条件。另外还有一些检查方法,来查看view的约束和约束状态:

  • [view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical]
  • [view hasAmbiguousLayout]
  • [view exerciseAmbiguityInLayout]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值