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 *)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 *)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时这个属性很常用。
AutoLayout 是通过约束来组织 UI 组件之间的关系,它的功能非常丰富广泛,几乎可以完美适配所有的情况,它实际上也是通过约束计算 frame,但是它本质上是一种方程组求解,会带来很大的性能损耗(真的很大),如果在布局非常复杂的地方使用 AutoLayout,基本没可能到 60fps。而 frame 则需要自己计算位置。两者都可以
自动布局主要是在界面上设置,会方便一点。
自动布局主要是建立依赖关系,所以适配的问题考虑的会少很多。
写frame要自己来判断适配的环境了。
纯代码来说,无论是写frame还是自动布局代码量都会很大。
当然自动布局的框架会丰富一些,语法糖更甜一些。