iOS 图形几何学 三
3.5 自动布局
你可能用过UIViewAutoresizingMask
类型的一些常量,应用于当父视图改变尺寸的时候,相应UIView
的frame
也跟着更新的场景(通常用于横竖屏切换)。
在iOS6中,苹果介绍了自动排版机制,它和自动调整不同,并且更加复杂。
在Mac OS平台,CALayer
有一个叫做layoutManager
的属性可以通过CALayoutManager
协议和CAConstraintLayoutManager
类来实现自动排版的机制。但由于某些原因,这在iOS上并不适用。
当使用视图的时候,可以充分利用UIView
类接口暴露出来的UIViewAutoresizingMask
和NSLayoutConstraint
API,但如果想随意控制CALayer
的布局,就需要手工操作。最简单的方法就是使用CALayerDelegate
如下函数:
- (void)layoutSublayersOfLayer:(CALayer *)layer;
当图层的bounds
发生改变,或者图层的-setNeedsLayout
方法被调用的时候,这个函数将会被执行。这使得你可以手动地重新摆放或者重新调整子图层的大小,但是不能像UIView
的autoresizingMask
和constraints
属性做到自适应屏幕旋转。
这也是为什么最好使用视图而不是单独的图层来构建应用程序的另一个重要原因之一。
总结
本章涉及了CALayer
的集合结构,包括它的frame
,position
和bounds
,介绍了三维空间内图层的概念,以及如何在独立的图层内响应事件,最后简单说明了在iOS平台,Core Animation对自动调整和自动布局支持的缺乏。
在第四章“视觉效果”当中,我们接着介绍一些图层外表的特性。