AutoLayout---Interface Builder

参考链接 

http://blog.csdn.net/meegomeego/article/details/39991057

http://blog.csdn.net/yongyinmg/article/details/39315821

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

http://blog.csdn.net/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 一般我都不勾

AutoLayout---Interface Builder_第1张图片

(2)

AutoLayout---Interface Builder_第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的图

AutoLayout---Interface Builder_第3张图片

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

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

Priority表示优先级 


在哪里设置限制呢


AutoLayout---Interface Builder_第4张图片

或者是Editor--Pin

Interface Builder如何限制

AutoLayout---Interface Builder_第5张图片

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

接下来说说一些例子

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

所以只需要2条限制即可
AutoLayout---Interface Builder_第6张图片
如果numberOfLine = 0的话,就看你自己要自适应宽度还是自适应高度。

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

一些警告处理
AutoLayout---Interface Builder_第7张图片
修改了控件的位置或大小 你就可以通过这边来更新限制或者更新frame

等到都限制好了可以先preview一下  每次运行真的好慢啊
AutoLayout---Interface Builder_第8张图片

容易出现的错误

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

  • 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]

你可能感兴趣的:(iOS开发系列)