iOS frame布局 与 自动布局有什么区别呢?以及各自的应用场景
问题修改:
通过自动布局,我觉得跟frame 最大的区别就是自动布局可以在依赖的控件发生变化的时候紧跟变化,而frame 做不到的(可能我知识量不够,不知道有别的好方案哈,请指出),如下代码与gif图
/// 这是自动布局的代码
#import "ViewController.h"
#import "UIView+SGExtension.h"
#import "Masonry.h"
@interface ViewController ()
@property (nonatomic, strong) UIView *kenView;
@property (nonatomic, strong) UIButton *kenBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.kenView];
[self.kenView addSubview:self.kenBtn];
[self.kenBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.kenView);
make.width.equalTo(@(50));
make.height.equalTo(self.kenView.mas_height);
}];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.kenView.height += 10;
}
-(UIView *)kenView{
if (_kenView == nil) {
_kenView = [[UIView alloc] init];
_kenView.frame = CGRectMake(0, 0, 100, 100);
_kenView.backgroundColor = [UIColor orangeColor];
}
return _kenView;
}
-(UIButton *)kenBtn{
if (_kenBtn == nil) {
_kenBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_kenBtn.backgroundColor = [UIColor purpleColor];
}
return _kenBtn;
}
@end
/// 这是frame 布局的代码
#import "ViewController.h"
#import "UIView+SGExtension.h"
#import "Masonry.h"
@interface ViewController ()
@property (nonatomic, strong) UIView *kenView;
@property (nonatomic, strong) UIButton *kenBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.kenView];
[self.kenView addSubview:self.kenBtn];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.kenView.height += 10;
}
-(UIView *)kenView{
if (_kenView == nil) {
_kenView = [[UIView alloc] init];
_kenView.frame = CGRectMake(0, 0, 100, 100);
_kenView.backgroundColor = [UIColor orangeColor];
}
return _kenView;
}
-(UIButton *)kenBtn{
if (_kenBtn == nil) {
_kenBtn = [UIButton buttonWithType:UIButtonTypeCustom];
_kenBtn.backgroundColor = [UIColor purpleColor];
}
_kenBtn.height = self.kenView.height;
_kenBtn.width = 50;
_kenBtn.center = self.kenView.center;
return _kenBtn;
}
@end
其实自动布局和手写代码布局的目的都是一样的,只是过程(实现方法)不一样。自动布局相当于封装了一套布局 UI 的配置文件,然后根据这个配置文件自动设置 frame ,同时在 Xcode 里也提供了方便快捷的操作方法来编辑这个配置文件。自动布局最大的优势就是开发快、操作方便。但是封装的这一套规则也不是万能的,有些比较复杂的布局场景下还是要借助或完全手写代码或来完成布局。而手动代码布局的优势是完全掌控,伴随的问题就是你要自己思考怎么写代码。
至于用哪个,没有标准,哪个熟练就用哪个。我个人情况是从 Xcode4 之后就没再用过 xib 了,到后来出了 autolayout storyboard sizeclass 我都没学过,这些都不会 除了启动画面,其它界面都是手写的。
你这个问题可能新手比较容易犯疑,现在的 iOS 入门基本都会接触和使用到自动布局,网上的代码又很多是手写布局。如果你在公司有过几个项目经验,自然而然就知道该怎么选择了。有篇文章你也可以参考下http://blog.devtang.com/2015/...
--- update:
哦,原来你是这个意思。
首先可以肯定的是 autolayout 配合 Masonry 写布局很爽。
你是要subview跟随的 superview 变化是吧,在你初始化 kenBtn 里加一行代码就行了:
autoresizingMask 属性参阅官方文档。在处理屏幕旋转、一份代码适配iPad/iPhone时这个属性很常用。