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 如何创建一个占位符约束

 

  1. Add the desired constraint as normal. 添加一个约束

  2. Select the constraint, then open the Attributes inspector. 选择约束打开属性

  3. 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

 

  1. With the view selected, open the Size inspector.选择view打开size inspector。

  2. Under the Intrinsic Size option, select Placeholder.  在intrinsic size选项下面选择placeholder

  3. Set appropriate values for the width and height.   设置合适的宽度和高度

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-12-25 16:08  如来藏  阅读(172)  评论(0编辑  收藏  举报