Massory布局相对、对scrollview自动计算contentSize

更新时间:2023-07-13 20:22:37 阅读: 评论:0

Massory布局相对、对scrollview⾃动计算contentSize
以上是纯⼿写代码所经历的关于页⾯布局的三个时期
在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算⼀下相对位置就好了
在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们⾮常⼤的福利:window的size不变
在iphone5-iphone5s时代 window的size变了(320,568) 这时autoresizingMask派上了⽤场(为啥这时候不⽤Autolayout? 因为还要⽀持ios5呗) 简单的适配⼀下即可
在iphone6+时代 window的width也发⽣了变化(相对5和5s的屏幕⽐例没有变化) 终于是时候抛弃autoresizingMask改⽤autolayout了(不⽤⽀持ios5了 相对于屏幕适配的多样性来说autoresizingMask也已经过时了)
那如何快速的上⼿autolayout呢? 说实话 当年ios6推出的同时新增了autolayout的特性 我看了⼀下官⽅⽂档和demo 就⽴马抛弃到⼀边了因为实在过于的繁琐和啰嗦(有过经验的朋友肯定有同感)
直到iPhone6发布之后 我知道使⽤autolayout势在必⾏了 这时想起了以前在浏览Github看到过的⼀个第三⽅库Masonry 在花了⼏个⼩时的研究使⽤后 我就将autolayout掌握了(重点是我并没有学习任何的官⽅⽂档或者其他的关于autolayout的知识) 这就是我为什么要写下这篇⽂章来推荐它的原因.
介绍
Masonry是⼀个轻量级的布局框架 拥有⾃⼰的描述语法 采⽤更优雅的链式语法封装⾃动布局 简洁明了 并具有⾼可读性 ⽽且同时⽀持 iOS 和 Max OS X。
我们先来看⼀段官⽅的sample code来认识⼀下Masonry
1 2 3[view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.ints(padding); }];
看到block⾥⾯的那句话: make edges equalTo superview with ints 通过链式的⾃然语⾔ 就把view1给autolayout好了 是不是简单易懂?
使⽤
看⼀下Masonry⽀持哪⼀些属性
1 2 3 4 5 6 7 8 9 10 11@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom; @property (nonatomic, strong, readonly) MASConstraint *leading; @property (nonatomic, strong, readonly) MASConstraint *trailing; @property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height; @property (nonatomic, strong, readonly) MASConstraint *centerX; @property (nonatomic, strong, readonly) MASConstraint *centerY; @property (nonatomic, strong, readonly) MASConstraint *baline;
这些属性与NSLayoutAttrubute的对照表如下
其中leading与left trailing与right 在正常情况下是等价的 但是当⼀些布局是从右⾄左时(⽐如阿拉伯⽂?没有类似的经验) 则会对调 换句话说就是基本可以不理不⽤ ⽤left和right就好了
在ios8发布后 ⼜新增了⼀堆奇奇怪怪的属性(有兴趣的朋友可以去瞅瞅) Masonry暂时还不⽀持(不过你要⽀持ios6,ios7 就没必要去管那么多了)
在讲实例之前 先介绍⼀个MACRO
党支部副书记1#define WS(weakSelf)  __weak __typeof(&*lf)weakSelf = lf;
替父从军快速的定义⼀个weakSelf 当然是⽤于block⾥⾯啦 下⾯进⼊正题(为了⽅便 我们测试的superView都是⼀个size为(300,300)的UIView)
下⾯ 通过⼀些简单的实例来简单介绍如何轻松愉快的使⽤Masonry:
1. [基础] 居中显⽰⼀个view
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17- (void)viewDidLoad
{
眉骨高狗狗过敏
[super viewDidLoad];
// Do any additional tup after loading the view.
WS(ws);
UIView *sv = [UIView new];
[sv showPlaceHolder];
sv.backgroundColor = [UIColor blackColor];
[lf.view addSubview:sv];
[sv mas_makeConstraints:^(MASConstraintMaker *make) { equalTo(ws.view);
make.size.mas_equalTo(CGSizeMake(300, 300));
}];
}
代码效果
绿萝藤
使⽤我之间写的MMPlaceHolder 可以看到superview已经按照我们预期居中并且设置成了适当的⼤⼩那么先看看这⼏⾏代码
1 2 3 4 5 6 7 8 9 10 11 12//从此以后基本可以抛弃CGRectMake了
做文员的基本要求
UIView *sv = [UIView new];
//在做autoLayout之前⼀定要先将view添加到superview上否则会报错
[lf.view addSubview:sv];
丝路文化//mas_makeConstraints就是Masonry的autolayout添加函数将所需的约束添加到block中⾏了[sv mas_makeConstraints:^(MASConstraintMaker *make) {
//将sv居中(很容易理解吧?)
//将size设置成(300,300)
make.size.mas_equalTo(CGSizeMake(300, 300));
}];
这⾥有两个问题要分解⼀下
⾸先在Masonry中能够添加autolayout约束有三个函数
1 2 3 4 5 6 7 8 9- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
/*
mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同⼀对象的约束否则会报错mas_updateConstraints 针对上⾯的情况会更新在block中出现的约束不会导致出现两个相同约束的情况mas_remakeConstraints 则会清除之前的所有约束仅保留最新的约束
三种函数善加利⽤就可以应对各种情况了
*/
其次 equalTo 和 mas_equalTo的区别在哪⾥呢? 其实 mas_equalTo是⼀个MACRO
1 2 3 4#define mas_equalTo(...)                equalTo(MASBoxValue((__VA_ARGS__)))
#define mas_greaterThanOrEqualTo(...)    greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
#define mas_lessThanOrEqualTo(...)      lessThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
#define mas_offt(...)                  valueOfft(MASBoxValue((__VA_ARGS__)))
可以看到 mas_equalTo只是对其参数进⾏了⼀个BOX操作(装箱) MASBoxValue的定义具体可以看看源代码 太长就不贴出来了所⽀持的类型 除了NSNumber⽀持的那些数值类型之外 就只⽀持CGPoint CGSize UIEdgeInts
介绍完这⼏个问题 我们就继续往下了 PS:刚才定义的sv会成为我们接下来所有sample的superView
2. [初级] 让⼀个view略⼩于其superView(边距为10)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18UIView *sv1 = [UIView new];
[sv1 showPlaceHolder];
sv1.backgroundColor = [UIColor redColor];
[sv addSubview:sv1];
[sv1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(sv).with.ints(UIEdgeIntsMake(10, 10, 10, 10));
/* 等价于
make.left.equalTo(sv).with.offt(10);
make.bottom.equalTo(sv).with.offt(-10);
make.right.equalTo(sv).with.offt(-10);
*/
/* 也等价于
*/
}];
代码效果
可以看到 edges 其实就是top,left,bottom,right的⼀个简化 分开写也可以 ⼀句话更省事
那么为什么bottom和right⾥的offt是负数呢? 因为这⾥计算的是绝对的数值 计算的bottom需要⼩鱼sv的底部⾼度 所以要-10 同理⽤于right
这⾥有意思的地⽅是and和with 其实这两个函数什么事情都没做
1 2 3 4 5 6- (MASConstraint *)with{ return lf;
}
- (MASConstraint *)and { return lf;
}
但是⽤在这种链式语法中 就⾮常的巧妙和易懂 不得不佩服作者的⼼思(虽然我现在基本都会省略) 3. [初级] 让两个⾼度为150的view垂直居中且等宽且等间隔排列 间隔为10(⾃动计算其宽度)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15int padding1 = 10;
[sv2 mas_makeConstraints:^(MASConstraintMaker *make) { Y.mas_equalTo(sv.mas_centerY);
make.left.equalTo(sv.mas_left).with.offt(padding1);
make.right.equalTo(sv3.mas_left).with.offt(-padding1);
make.height.mas_equalTo(@150);
make.width.equalTo(sv3);
}];
[sv3 mas_makeConstraints:^(MASConstraintMaker *make) { Y.mas_equalTo(sv.mas_centerY);
make.left.equalTo(sv2.mas_right).with.offt(padding1);
make.right.equalTo(sv.mas_right).with.offt(-padding1);
make.height.mas_equalTo(@150);
make.width.equalTo(sv2);
形影不离造句}];
代码效果
这⾥我们在两个⼦view之间互相设置的约束 可以看到他们的宽度在约束下⾃动的被计算出来了4. [中级] 在UIScrollView顺序排列⼀些view并⾃动计算contentSize
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15UIScrollView *scrollView = [UIScrollView new];
scrollView.backgroundColor = [UIColor whiteColor];
[sv addSubview:scrollView];
[scrollView mas_makeConstraints:^(MASConstraintMaker *make) {    make.edges.equalTo(sv).with.ints(UIEdgeIntsMake(5,5,5,5)); }];
UIView *container = [UIView new];
[scrollView addSubview:container];
[container mas_makeConstraints:^(MASConstraintMaker *make) {    make.edges.equalTo(scrollView);
make.width.equalTo(scrollView);
}];
int count = 10;
UIView *lastView = nil;
for( int i = 1 ; i <= count ; ++i )

本文发布于:2023-07-13 20:22:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1094870.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:约束   基本   没有   居中   布局   新增   计算   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图