布局的三种方式
1.frame绝对布局
2.frame + autoResizing布局
3.autoLayout
frame
原始位置
redView:frame(0,0,300,300) bounds:(0,0,300,300)
blueView:frame(0,0,100,100) bounds:(0,0,100,100)
-
*修改父view的bounds.orgin的值,父view的位置不会修改,子view在父view中显示的位置会改变,但相应的位置信息不会改变。修改子view的bounds.orgin不会影响父view的位置。
修改redView的bounds为(-20,-20,300,300),效果如图1.2
-
修改父view的bounds.size的值,父view的center不变,frame相应改变。
修改redView的bounds为(0,0,150,150),效果如图1.3
autoResizing
@property(nonatomic) BOOL autoresizesSubviews; // default is YES. if set, subviews are adjusted according to their autoresizingMask if self.bounds changes
@property(nonatomic) UIViewAutoresizing autoresizingMask; // simple resize. default is UIViewAutoresizingNone
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
使用autoresizing需要在stroyboard等可视化界面中,File inspector下,取消Use Size Class选项。
autoResizing可以使view根据实际的屏幕尺寸,来自动调整 子控件和父控件之间的间距/子空间的宽高。不能用来设置同级视图之间的位置关系(iOS6之后的autoLayout可以设置任意两个控件之间的关系)。
-
Autoresizing栏,外部四条边用来设置view的top/left/bottom/right和其父视图的间距是否固定,内部的两条边用来设置view的width/height是否会随着父视图尺寸的改变自动调整。
autoResizing必须在320x480的屏幕上初始化布局,否则在比例缩放时会发生错误。因为autoResizing是在Retina显示屏出现之前,主要用来做横竖屏适配的。
autoLayout
使用autoresizing需要在stroyboard等可视化界面中,File inspector下勾选Use Auto Layout。
- iOS6系统下出现autoLayout布局,通过添加约束对象,可以设置任何控件之间的关系。
- autoLayout引用的目的是替代autoResizing的使用,所以需要关闭autoResizing的属性。
- Constrain to margins
Xcode 8.0版本,视图与ViewController根视图之间 左右间距的系统推荐的间距值为 16pt。在Xcode 8.0 之前版本,推荐间距值为 20pt。
Xcode 8.0 版本及之前版本,两个普通父子视图之间 上下左右间距的系统推荐的间距值都为 8pt。