Autolayout 02
Working with Auto Layout Programmatically
如果你在运行阶段添加或者移除views你就需要通过代码来添加约束来保证你的interface能正确适应size或者orientation的改变。
Creating Constraints Programmatically
NSLayoutConstraint使用这个实例来表示约束。为了创建约束,你一般要使用constraintsWithVisualFormat:options:metrics:views:方法来实现。
这个方法的第一个参数是visual format string,提供一个你想要描述的可视化layout描述。例如,你可能想表示两个button间的约束:
使用如下的visual format string:[button1]-12-[button2]
NSDictionary *viewsDictionary =
NSDictionaryOfVariableBindings(self.button1, self.button2);
NSArray *constraints =
[NSLayoutConstraint constraintsWithVisualFormat:@"[button1]-[button2]"
options:0 metrics:nil views:viewsDictionary];
Installing Constraints
为了使约束起作用,你必须把它添加到view中去。
Suppose you install [zoomableView1]-80-[zoomableView2] on the common ancestor of zoomableView1 and zoomableView2.
如果任何一个可以缩放的view的bounds改变了,那么他们之间的space依然存在不会改变。
如果容器本身的bounds改变了,那么space也会缩放
NSView提供一个方法addConstraint来添加一个约束,removeConstraint来移除或者inspec现有的约束。还提供一个方法,fittingSize和方法sizeToFit方法很类似,但是这个方法是针对任意的view而不是控件。
Resolving Auto Layout Issues
当你创建了冲突的约束或者当你没有提供足够的约束或者当最终的layout包含一系列模糊不清的约束的时候就会出现问题。虽然出现问题,auto layout系统还是会让你的app能够运行但是理解如何解决这些问题却是很重要的。
Identifying Issues
interface builder在不同的地方显示auto layout问题。
In the Issues Navigator 在issues navigator中
In the Interface Builder outline view 在interface builder outline view中。如果有任何的问题那么interface builder outline view会显示一个箭头。如果有冲突或者有歧义的那么箭头就是红色的,如果是误放的那么就会是黄色的箭头。
点击箭头你会发现一个issue列表,包含了相关控件和约束的信息。点击error或者warning就可以查看具体的描述。
On the canvas.
Resolving View Misplacement 解决错误放置
在interface builder中,约束和框架是分开的。如果view在画布中看到的摆放的frame和经过约束设置运行时候的位置不一样,那么就是view misplacement。
interface builder会用橘色来显示被误放的view。用红色圆点儿来显示在运行时候view将要显示的位置。
To resolve misplacement 为了解决误放
选择Issues->Update Frames. 这个操作会使元素回到被误放之前的位置。frames改变来满足现有的约束。
选择Issues->Update Constraints.这个会使得约束更新到元素的新位置。约束改变来匹配当前的frames。
Resolving Constraint Conflicts
当你设置了一些约束auto layout无法满足的时候,不如为一个元素设置了两个不同的宽度。有冲突的约束会以红色显示在画布上,并且显示出真实的大小。
To resolve a constraint conflict解决冲突
- Delete one of the conflicting constraints. 删除其中一个有冲突的约束。
Resolving Ambiguity 解决歧义
当你给出的约束可以产生多个针对view size和位置的解决方案的时候。
interface builder会绘制橘色的frame边框来显示歧义。为了更好的了解歧义可以使用issues navigator。解决歧义依赖于引起歧义的条件。
One or More Constraints Are Missing
最简单的例子中,没有足够的约束。例如,你约束了一个元素的水平位置但是没有为垂直位置添加约束。为了解决这个歧义你需要添加忽略的约束。
To add missing constraints
Choose Issues > Add Missing Constraints. 选择 issues-> Add Missing Constraints.
Content Size Is Undefined
一些容器views,例如stack view。依赖于内容大小来决定他们自己运行时的大小。意思是在design time的时候size是未知的。为了解决这个问题,你需要设置占位符约束。例如一个视图的最小宽度的展位福。
这个占位符在运行阶段你的view定义了他的大小的时候会移除。
To create a placeholder constraint 如何创建一个占位符约束
-
Add the desired constraint as normal. 添加一个约束
-
Select the constraint, then open the Attributes inspector. 选择约束打开属性
-
Select the checkbox next to the Placeholder option.选择placeholder 选项
The Size of Custom View Content Is Unknown
不像标准的view,自定义的view没有定义的固有的内容size。在设计阶段,interface builder不知道一个自定义的view大小。为了解决这个问题,你需要设置一个
placeholder intrinsic content size 来指定自定义view的内容大小。
To set a view’s placeholder intrinsic content size 为了设置view的占位符content size
-
With the view selected, open the Size inspector.选择view打开size inspector。
-
Under the Intrinsic Size option, select Placeholder. 在intrinsic size选项下面选择placeholder
-
Set appropriate values for the width and height. 设置合适的宽度和高度