在自动布局中基本构建块是约束(constraint)。约束表现在你的界面元素的布局规则,例如,您可以创建一个约束,指定该元素的宽度,或跟另一个元素的水平距离。你可以通过添加和删除约束,或改变约束的性质,来影响你的界面布局。。
当正在计算用户界面元素的运行位置时,自动布局系统同时考虑所有约束,以最能满足所有的约束来设置位置。
你可以把约束想象为一个:人可表达语句的数学表达方式。例如,如果你定义一个按钮的位置,你可能会说“左边缘应该是:距离它的包含视图的左边缘20points。”更正式地讲 ,这可以转化为
,它的另一种表达的形式button.left = (container.left + 20)
为
,其中:y = m*x + b
y
和x为
属性的属性。
m和b为浮点值。
其中的属性(attribute )是指: left
, right
, top
, bottom
, leading
, trailing
, width
, height
, centerX
, centerY
, 和 baseline.
leading 和trailing 属性和left,
right在
英语中的意思是相同的,但在从右到左的特殊环境中,如希伯来文或阿拉伯文,leading和trailing
都是一样的right和left。当您创建约束时,leading
和trailing
是默认值。通常你应该使用leading 和trailing ,以确保您的接口布局在所有的语言中正确使用,除非你正在做的约束无论什么语言都应该保持不变(如在拆分视图中主视图和详细信息视图的顺序)。
约束还可以有其他的属性设置:
恒定值(Constant value)如约束中的物理尺寸或偏移点数值。
关系(Relation)自动布局不仅仅支持视图中的恒定属性值;例如,您可以使用关系和不等式,如大于或等于去指定视图的width> = 20
,甚至可以说textview.leading >= (superview.leading + 20).
。
优先级(Priority level)约束还有优先级。先满足较高优先级的约束而后满足较低优先级的约束。默认的优先级(NSLayoutPriorityRequired
)意味着,约束必须精确地满足。即使它不能完全实现,布局系统应该尽可能接近来满足可选的约束。
优先级允许你表达有用的条件行为。例如,它们被用来表达某些控件应该始终是,大小适配他们的内容,除非有优先级更高更重要的东西。对于优先级的更多信息,请参阅NSLayoutPriority
。
约束是累加的,不互相覆盖。如果你有一个现有的约束,再设置另一个相同类型的约束,它不会覆盖前一个。例如,为视图设置第二宽度约束不删除或改变第一宽度约束。---事实上你需要手动删除第一个约束。
有一些约束可以跨越视图层次。例如,在OS X系统中的Mail app应用程序,默认情况下删除按钮在message table工具栏线的上方;桌面使用偏好中,复选框在窗口的底部与分割视图面板操作对齐。
You cannot set a constraint to cross the view hierarchy if the hierarchy includes a view that sets the frames of subviews manually in a custom implementation for thelayoutSubviews
method on UIView
(or the layout
method on NSView
)。
它也没有能够跨越任何视图,如果视图有一个边界变换(如滚动视图 scroll view)。你可以认为这种视图是一种障碍(有一个内心世界和外部世界),通过约束里面不能够连接到外面的世界。
叶级(如按钮)的视图通常都知道他们应该是什么尺寸比起那些定位它们的代码。通过Intrinsic Content Size告诉布局系统视图中包含的一些内容和其大小(它本身并不了解)。
对于一些像文本标签类的元素,您通常应设置元素其内在的大小(select Editor > Size To Fit Content)。这意味着,该元素将根据不同的内容,不同的语言来适当增长和收缩。
自动布局负责在控制器和视图之间分配责任。而不是写一个无所不知的控制器,计算视图需要对于一个给定的几何,视图变得更加self-organizing。这种方法可以减少控制器逻辑的复杂性,可以更容易地重新设计视图布局代码,而不需要相应的变化。
您可能仍然需要在运行时动态添加,删除,或调整约束的对象。要了解更多关于管理约束代码,请阅读《Working with Auto Layout Programmatically》
虽然视图指定其内在的内容的大小,视图的用户指定其重要性。例如,默认情况下,一个按钮:
强烈地想要在垂直方向拥抱它的内容(按钮真的应该是他们的自然高度)
水平方向拥抱其内容(额外的侧面填充标题和边缘之间的挡板是可以接受的)
在两个方向强烈抵抗压缩或剪切的内容
UIView
中使用setContentHuggingPriority:forAxis: 和
。默认情况下,所有的UIKit和AppKit的视图在setContentCompressionResistancePriority:forAxis:
(forNSView
, you usesetContentHuggingPriority:forOrientation:
andsetContentCompressionResistancePriority:forAxis:
)来设定伸缩优先级NSLayoutPriorityDefaultHigh
或NSLayoutPriorityDefaultLow都
有一个值。
Copyright © 2013 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2013-09-18
TheLittleBoy翻译,转载请注明出处,谢谢!