MMLayout
今天想介绍的就是开发中,布局的问题. 本人一直使用的传统的Frame来写UI 个人习惯,我觉得Frame 的效率还是比autolayout要高的,这个小伙伴可以测试一下的.
但是使用Frame 的时候 代码计算的时候很多,比如距离左边的控件的最大x值是多少,这样写来写去,实在代码可以不方便看,然后还的自己计算,很麻烦.
我自己整了一个 UIView的扩展 我相信类似的扩展大家都有的用 下面贴上代码!
@interface UIView (MM)
- (void)setX:(CGFloat)x;
- (CGFloat)x;
- (void)setY:(CGFloat)y;
- (CGFloat)y;
- (void)setW:(CGFloat)w;
- (CGFloat)w;
- (void)setH:(CGFloat)h;
- (CGFloat)h;
- (CGFloat)maxY;
- (CGFloat)minY;
- (CGFloat)maxX;
- (CGFloat)minX;
- (CGFloat)halfW;
- (CGFloat)halfH;
- (CGFloat)halfX;
- (CGFloat)halfY;
@end
@interface MMLayout : NSObject
-(instancetype)initWithLayoutView:(UIView *)LayoutView;
@property (assign , nonatomic) CGFloat top; //上
@property (assign , nonatomic) CGFloat bottom; //下
@property (assign , nonatomic) CGFloat left; //左
@property (assign , nonatomic) CGFloat right; //右
@property (assign , nonatomic) CGFloat width; //右
@property (assign , nonatomic) CGFloat height; //右
@property (assign , nonatomic) CGSize size;
//距离父控件中心 //<
- (void)center;
@end
@interface UIView (Layout)
//设置自己的Layout
- (void)make_Layout:(void(^)(MMLayout * layout))layout;
@end
最上面的UIView的扩展很简单,就是把x y 等等值简化的调用,
MMLayout这个Model类最后控制设置Frame
下面是简单的调用 下面的使用时在UIViewController 里面添加UI使用
-(void)viewDidLayoutSubviews{
[self.yellowView make_Layout:^(MMLayout *layout) {
layout.width = 100;
layout.height = 200;
layout.left = 5;
layout.top = 100;
}];
__weak typeof(self)_self = self;
[self.yellowViewTwo make_Layout:^(MMLayout *layout) {
__strong typeof(_self)self = _self;
layout.left = self.yellowView.maxX + 5;
layout.top = self.yellowView.y;
layout.size = self.yellowView.bounds.size;
}];
[self.yellowViewTree make_Layout:^(MMLayout *layout) {
layout.height = 50;
layout.width = 100;
layout.right = 10;
layout.top = 10;
}];
}
平时在控制器写UI代码的时候布局的代码 我一般都会写在 - (void)viewDidLayoutSubviews
这个方法当控制器的View发生变化的时候会来到这个方法,比如一个场景,就是横竖屏的时候,你不用监听屏幕的旋转,只要在这里写上相对好的布局,横竖屏的时候会自己调用这个方法,从新的计算子控件的位置.
假设你在自定义View的时候在View的里面写布局的方法是 layoutSubviews 这个方法 父控件发生变化会调用LayoutSubViews
个人觉得,如果你用代码写aotolayout的话,有的时候更新约束,也是很麻烦的一件事.然后调试的时候,也会出现各种aotolayout的错误提示.
使用frame来写,避免了aotolayout的错误,错误率降低了.
话又说回来,autoLaout 确实很强大. 比如写UILabel的时候很方便,用frame写的话,还得计算text的size. 不过开发中,使用某一个东西,当然是有利有弊.这个还的根据大家的喜好,和公司的规范.来开发.
谢谢大家.