当一个视图的大小改变时,其子视图的大小和位置也要做相应的改变。UIView类支持自动(xib文件对应的size inspector设置)或手动(代码方式)更新视图继承关系中视图的排列。
视图的排列变化会因为下面的事件发生而触发:
视图bounds矩形的变化;
设备转向发生时,该操作通常会改变根视图的bounds矩形;
与视图layer相关联的一组Core Animation子layer发生变化且需要重排;
你的应用程序通过调用一个视图的setNeedsLayout或layoutIsNeeded方法来要求重排;
你的应用程序通过调用一个视图下面layer对象的setNeedsLayout方法来要求重排
手动方式
1. 设置视图的autoResizesSubviews属性为True
2. 设置视图的autoResizingMask属性值
auto resizing constants:
UIViewAutoresizingNone:该视图不进行autoresizing操作;
UIViewAutoresizingFlexibleHeight:视图的高度随着父视图的高度的变化自动变化。如果没有包含这个常量,则视图的高度不会变化。
UIViewAutoresizingFlexibleWidth:视图的宽度随着父视图的宽度的变化自动变化。如果没有包含这个常量,则视图的宽度不会变化。
UIViewAutoresizingFlexibleLeftMargin:视图左边界与父视图左边界的距离根据需要自动的增长或压缩。如果没有包含这个常量,则视图左边界与父视图左边界的距离保持不变。
UIViewAutoresizingFlexibleRightMargin:视图右边界与父视图右边界的距离根据需要自动的增长或压缩。如果没有包含这个常量,则视图右边界与父视图右边界的距离保持不变。
UIViewAutoresizingFlexibleTopMargin:视图上边界与父视图上边界的距离根据需要自动的增长或压缩。如果没有包含这个常量,则视图上边界与父视图上边界的距离保持不变。
UIViewAutoresizingFlexibleBottomMargin:视图下边界与父视图下边界的距离根据需要自动的增长或压缩。如果没有包含这个常量,则视图下边界与父视图下边界的距离保持不变。
自动方式
选中视图对应的xib文件,在size inspector修改如下图所示的部分:
左视图
外框表示父视图,内框表示子视图(也就是当前所中的视图)包含在父视图中。
内框中,模糊的点画线表示当前选中的视图对象不根据父视图的变化改变其高度和宽度。红实线则表示前选中的视图对象根据父视图的变化改变其高度和宽度。
内外框之间的线,当选中(红实线)时表示当父视图大小改变时,当前选中视图与父视图相应边之间的距离保持不变。
特别注意:对于内框视图,选中(红实线)表示在autoResizingMask属性中设置UIViewAutoresizingFlexibleHeight或UIViewAutoresizingFlexibleWidth常量。而内外框之间的线,选中(红实线)表示在autoResizingMask属性中没有设置UIViewAutoresizingFlexibleLeftMargin,UIViewAutoresizingFlexibleRightMargin,UIViewAutoresizingFlexibleTopMargin或UIViewAutoresizingFlexibleBottomMargin常量。
当一个视图的大小改变时,UIKIT对该视图的所有子视图使用设置autoSizing属性,然后调用视图的layoutSubViews方法方便用户对子视图再次进行手动修改。你可以定义该方法用以完成以下的操作:
调整子视图的大小和位置;
增加或移除子视图或Core Animation层;
强制要求子视图通过调用setNeedsDisplay或setNeedsDisplayInRect:进行重绘。