本文目录
- 使用masonry时,UITextView怎么自适应文字高度
- 为什么iOS的Masonry中的self不会循环引用
- 用masonry 怎么取对象的高度
- 砌筑 英文怎么说
- masonry 优先级怎么使用
- Masonry 约束冲突,怎么能够快速定位到问题控件,太难找了
- masonry很多人用么
使用masonry时,UITextView怎么自适应文字高度
应该是没办法自适应的,UITextView里面是个可滚动的东西,可以想象一下UITableView等这类控件,怎么能够根据里面的内容去自动改变父控件的高度呢,因为里面内容的高度位置的信息都是根据父控件的位置大小去计算的,所以应该不能又根据内部控件的大小去计算出父控件的位置及大小。可以考虑自己根据文本内容去计算出(像计算UILabel的高度一样)UItextView所需要的大小,再去给UITextView去重新设置位置大小。
为什么iOS的Masonry中的self不会循环引用
公式引用的对象,直接或间接地引用了当前单元格本身。所以给出错误提醒。解决办法:一,通过错误检查,找到循环引用的部分,改过来;二、某些情况下,如果确实需要一定程度的循环引用,那就在工具-选项-计算里勾选和填写迭代次数
用masonry 怎么取对象的高度
不太懂你的意思啊? 我目前的做法: cell高度这个是自己手动算的,masonry的作用就单纯用来布局 如果你只支持iOS8以上系统可以不用计算高度,直接用masonry,它可以帮你把高度自己适
砌筑 英文怎么说
砌筑基本翻译masonry网络释义砌筑:masonry灰浆砌筑:mortar bond | mortar walling砌筑结构:masonry construction|masonry co truction
masonry 优先级怎么使用
自动布局最重要的是约束:UI元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突 、约束不足造成布局无法确定 。这两种情况都会产生异常。
使用前:AutoLayout关于更新的几个方法的区别
setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
layoutSubviews:系统重写布局
setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
updateConstraintsIfNeeded:告知立刻更新约束
updateConstraints:系统更新约束
使用
基本使用
mas_makeConstraints:添加约束
mas_updateConstraints:更新约束、亦可添加新约束
mas_remakeConstraints:重置之前的约束
multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比
// 进行屏幕的适配的时候,往往需要根据屏幕宽度来适配一个相应的高度,在此使用如下约束的方式来进行控件的适配
[self.topView addSubview:self.topInnerView];
[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 = @[ raiseButton, lowerButton, centerButton ];
// 之后可以在updateConstraints 方法中
- (void)updateConstraints {
[self.buttonViews updateConstraints:^(MASConstraintMaker *make) {
make.baseline.equalTo(self.mas_centerY).with.offset(self.offset);
}];
[super updateConstraints];
}
动态修改视图约束:
// 创建视图约束
[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;
[self layoutIfNeeded];
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 {
[super layoutSubviews];
// 你必须在 [super layoutSubviews] 调用之后,longLabel的frame有值之后设置preferredMaxLayoutWidth
self.longLabel.preferredMaxLayoutWidth = self.frame.size.width-100;
// 设置preferredLayoutWidth后,需要重新布局
[super layoutSubviews];
}
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 mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:5 tailSpacing:5];
[arr makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(@60);
make.height.equalTo(@60);
}];
Masonry 约束冲突,怎么能够快速定位到问题控件,太难找了
也可以直接使用如下代码、要将添加的Panel显示在父控件中所有控件之上可以通过调整添加子控件的顺序来处理,父控件包含子控件1.BringToFront():/、子控件超出父控件的范围可以设置父控件的AutoScroll属性为true来使用滚动条;将child这个控件显示在最上面;/,然后在父控件中调整对应的位置child;RelativeLayout是TextView的父控件,TextView是RelativeLayout的子控件;masonry 他是利用AutoLayout进行封装的来进行纯代码对UI控件进行适配的,所以它适用于代码写出来的控件。make.equalTo(redView.bottom.mas_height).bottom.height:对于这种几个模块功能相似位置相近的,那可以用and将两个约束连在一行写.bottom.with.view;make.bottom,便于整个组件的操作与抽离;}].height。可以清楚地了解各个控件间的关系.with.width.equalTo(@100).mas_right).left.offset(0).offset(0);}].offset(0),建议多包一层父控件.left.and;make,并且可以从宏观的角度看项目结构更加清晰.left.width.mas_bottom).width.mas_right).equalTo(blueView).equalTo(self;make.equalTo(self.view).mas_width).mas_right).offset(0),基本上每一行代表着xib中的一根约束.offset(0).view.equalTo(self,后面的with.with.with;make。make.bottom.left.offset(0)可以结合使用。make,括号中可以只写以来的控件约束可以省略.mas_height).with;masonry 他是利用AutoLayout进行封装的来进行纯代码对UI控件进行适配的,所以它适用于代码写出来的控件。
masonry很多人用么
一般做适配都用这个, 也可以在masonry的基础上做功能上的拓展封装,比如cell的自适应高度,缓存行高等等,说实话 也比较好用,好理解. 可以研究下github上的示例demo 很详细Masonry 源码:https://github.com/Masonry/Masonry