本文目录
masonry中的屏幕宽度一半怎么表示
1MagicNumber-》autoresizingMask-》autolayout以上是纯手写代码所经历的关于页面布局的三个时期在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源码Masonry是一个轻量级的布局框架拥有自己的描述语法采用更优雅的链式语法封装自动布局简洁明了并具有高可读性而且同时支持iOS和MaxOSX我们先来看一段官方的samplecode来认识一下Masonry1;看到block里面的那句话:makeedgesequalTosuperviewwithinsets通过链式的自然语言就把view1给autolayout好了是不是简单易懂?使用
用masonry 怎么取对象的高度
不太懂你的意思啊? 我目前的做法: cell高度这个是自己手动算的,masonry的作用就单纯用来布局 如果你只支持iOS8以上系统可以不用计算高度,直接用masonry,它可以帮你把高度自己适
masonry 两个label怎么相对布局
UIView *superview = self;UIView *view1 = 方法,在Masonry库中是自动向当前视图添加约束的,我们也可以通过self.subview.translatesAutoresizingMaskIntoConstraints = NO来手动设置。 并不是所有创建都一样 .equalTo 等价于 NSLayoutRelationEqual.lessThanOrEqualTo 等价于 NSLayoutRelationLessThanOrEqual.greaterThanOrEqualTo 等价于 NSLayoutRelationGreaterThanOrEqual
masonry很多人用么
一般做适配都用这个, 也可以在masonry的基础上做功能上的拓展封装,比如cell的自适应高度,缓存行高等等,说实话 也比较好用,好理解. 可以研究下github上的示例demo 很详细Masonry 源码:
Masonry 还维护么
第二个更好一点,masonry 是借鉴了CSS的思想PureLayout 是借鉴了IB的思想所以PureLayout更好点,更接近IOS况且masonry不支持swift,也不更新和维护了
masonry 优先级怎么使用
自动布局最重要的是约束:UI元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突 、约束不足造成布局无法确定 。这两种情况都会产生异常。
使用前:AutoLayout关于更新的几个方法的区别
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束
使用
基本使用
mas_makeConstraints:添加约束
mas_updateConstraints:更新约束、亦可添加新约束
mas_remakeConstraints:重置之前的约束
multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比
// 进行屏幕的适配的时候,往往需要根据屏幕宽度来适配一个相应的高度,在此使用如下约束的方式来进行控件的适配
;
[self.topInnerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(self.topView.mas_height).dividedBy(3);
make.width.and.height.lessThanOrEqualTo(self.topView);
make.width.and.height.equalTo(self.topView).with.priorityLow();
make.center.equalTo(self.topView);
}];
priorityLow()设置约束优先级
#define MAS_SHORTHAND_GLOBALS使用全局宏定义,可以使equalTo等效于mas_equalTo
#define MAS_SHORTHAND使用全局宏定义, 可以在调用masonry方法的时候不使用mas_前缀
// 这里注意到一个地方,就是当使用了这个全局宏定义之后,发现可以有个类`NSArray+MASAdditions.h`,看了之后发现可以
self.buttonViews = @;
// 之后可以在updateConstraints 方法中
- (void)updateConstraints {
[self.buttonViews updateConstraints:^(MASConstraintMaker *make) {
make.baseline.equalTo(self.mas_centerY).with.offset(self.offset);
}];
;
}
动态修改视图约束:
// 创建视图约束
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
self.animatableConstraint = make.edges.equalTo(superview).insets(paddingInsets).priorityLow();
]];
// 更改约束 (另一处方法中)
UIEdgeInsets paddingInsets = UIEdgeInsetsMake(padding, padding, padding, padding);
self.animatableConstraint.insets = paddingInsets;
;
debug模式:
// 对某个view添加key值
greenView.mas_key = @“greenView“;
// 或者如下顺序
MASAttachKeys(greenView, redView, blueView, superview);
// 同样的对每条约束亦可以添加key
make.height.greaterThanOrEqualTo(@5000).key(@“ConstantConstraint“);
preferredMaxLayoutWidth: 多行label的约束问题
// 已经确认好了位置
// 在layoutSubviews中确认label的preferredMaxLayoutWidth值
- (void)layoutSubviews {
;
// 你必须在 调用之后,longLabel的frame有值之后设置preferredMaxLayoutWidth
self.longLabel.preferredMaxLayoutWidth = self.frame.size.width-100;
// 设置preferredLayoutWidth后,需要重新布局
;
}
scrollView使用约束的问题:原理通过一个contentView来约束scrollView的contentSize大小,也就是说以子控件的约束条件,来控制父视图的大小
// 1. 控制scrollView大小(显示区域)
[self.scrollView makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
// 2. 添加一个contentView到scrollView,并且添加好约束条件
[contentView makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.scrollView);
// 注意到此处的宽度约束条件,这个宽度的约束条件是比添加项
make.width.equalTo(self.scrollView);
}];
// 3. 对contentView的子控件做好约束,达到可以控制contentView的大小
新方法:2个或2个以上的控件等间隔排序
/**
* 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值
*
* @param axisType 轴线方向
* @param fixedSpacing 间隔大小
* @param leadSpacing 头部间隔
* @param tailSpacing 尾部间隔
*/
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
withFixedSpacing:(CGFloat)fixedSpacing l
eadSpacing:(CGFloat)leadSpacing
tailSpacing:(CGFloat)tailSpacing;
/**
* 多个固定大小的控件的等间隔排列,变化的是间隔的空隙
*
* @param axisType 轴线方向
* @param fixedItemLength 每个控件的固定长度或者宽度值
* @param leadSpacing 头部间隔
* @param tailSpacing 尾部间隔
*/
- (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
withFixedItemLength:(CGFloat)fixedItemLength
leadSpacing:(CGFloat)leadSpacing
tailSpacing:(CGFloat)tailSpacing;
使用方法很简单,因为它是NSArray的类扩展:
// 创建水平排列图标 arr中放置了2个或连个以上的初始化后的控件
// alongAxis 轴线方向 固定间隔 头部间隔 尾部间隔
;
[arr makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(@60);
make.height.equalTo(@60);
}];