个人喜欢用纯代码写东西,其中用到最多的就是Masonry,我整理一些使用过程中一些点,方便以后使用.(基本的语法就不说了)
首先说几点:
我一般将数值类型的约束用mas_equalTo,而相对于某个控件,或者某个控件的某个约束,我会使用equalTo,如: make.size.mas_equalTo(CGSizeMake(100, 100)); make.center.equalTo(weakSelf.view);setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。 layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。 layoutSubviews:系统重写布局 setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始 updateConstraintsIfNeeded:告知立刻更新约束 updateConstraints:系统更新约束- (void)updateViewConstraints ViewController的View在更新视图布局时,会先调用ViewController的updateViewConstraints 方法。我们可以通过重写这个方法去更新当前View的内部布局,而不用再继承这个View去重写-updateConstraints方法。我们在重写这个方法时,务必要调用 super 或者 调用当前View的 -updateConstraints 方法。
1. 视图居中显示
__
weak typeof(
self) weakSelf =
self;
UIView* view = [
UIView new];
view
.backgroundColor = [
UIColor brownColor];
[
self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make
.size.mas_equalTo(
CGSizeMake(
200,
200));
make
.center.equalTo(weakSelf
.view);
}];
2. 两个视图等宽高边距
UIView* blackView = [
UIView new];
blackView
.backgroundColor = [
UIColor blackColor];
[
self.view addSubview:blackView];
[blackView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.size.mas_equalTo(
CGSizeMake(
100,
100));
make
.left.and.top.mas_equalTo(
20);
}];
UIView* grayView = [
UIView new];
grayView
.backgroundColor = [
UIColor lightGrayColor];
[
self.view addSubview:grayView];
[grayView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.size.and.top.equalTo(blackView);
make
.right.mas_equalTo(-
20);
}];
3. 键盘弹出和收回
- (
void)dealloc {
[[
NSNotificationCenter defaultCenter] removeObserver:
self];
}
- (
void)viewDidLoad {
[
super viewDidLoad];
__
weak typeof(
self) weakSelf =
self;
_textField = [
UITextField new];
_textField
.backgroundColor = [
UIColor redColor];
[
self.view addSubview:_textField];
[_textField mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.mas_equalTo(
20);
make
.centerX.equalTo(weakSelf
.view);
make
.height.mas_equalTo(
40);
make
.bottom.mas_equalTo(
0);
}];
[[
NSNotificationCenter defaultCenter] addObserver:
self selector:
@selector(keyboardWillChangeFrameNotification:) name:
UIKeyboardWillChangeFrameNotification object:
nil];
[[
NSNotificationCenter defaultCenter] addObserver:
self selector:
@selector(keyboardWillHideNotification:) name:
UIKeyboardWillHideNotification object:
nil];
}
- (
void)keyboardWillChangeFrameNotification:(
NSNotification *)notification {
NSDictionary *userInfo = [notification userInfo];
CGRect rect = [userInfo[
UIKeyboardFrameBeginUserInfoKey]
CGRectValue];
CGFloat keyboardHeight =
CGRectGetHeight(rect);
CGFloat keyboardDuration = [userInfo[
UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[_textField mas_updateConstraints:^(MASConstraintMaker *make) {
make
.bottom.mas_equalTo(-keyboardHeight);
}];
[
UIView animateWithDuration:keyboardDuration animations:^{
[
self.view layoutIfNeeded];
}];
}
- (
void)keyboardWillHideNotification:(
NSNotification *)notification {
NSDictionary *userInfo = [notification userInfo];
CGFloat keyboardDuration = [userInfo[
UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[_textField mas_updateConstraints:^(MASConstraintMaker *make) {
make
.bottom.mas_equalTo(
0);
}];
[
UIView animateWithDuration:keyboardDuration animations:^{
[
self.view layoutIfNeeded];
}];
}
- (
void)touchesBegan:(
NSSet *)touches withEvent:(
UIEvent *)event {
[
super touchesBegan:touches withEvent:event];
[
self.view endEditing:
YES];
}
4. 三控件等宽间距
方法一:
array 的 mas_distributeViewsAlongAxis withFixedSpacing 变化的是控件 长度或宽度
定义一个存放三个控件的数组NSArray *array; array = @[greenView,redView,blueView];
直接调用下面的方法:
- (
void)getHorizontalone
{
[arrayList mas_distributeViewsAlongAxis:MASAxisTypeHorizontal
withFixedSpacing:
20
leadSpacing:
5
tailSpacing:
5];
[arrayList mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(
60);
make.height.mas_equalTo(
100);
}];
}
方法二:
array de mas_distributeViewsAlongAxis withFixedItemLength 控件size不变,变化的是间隙
- (
void)getVertical
{
[arrayList mas_distributeViewsAlongAxis:MASAxisTypeVertical
withFixedItemLength:
60
leadSpacing:
40
tailSpacing:
10];
[arrayList mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(
20);
make.right.mas_equalTo(-
20);
}];
}
以上俩方法都在NSArray+MASAdditions中
方法三:直接设置multiplier实现等间距
for (
NSUInteger i =
0; i <
4; i++) {
UIView *itemView = [
self getItemViewWithIndex:i];
[_containerView addSubview:itemView];
[itemView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.width.and.height.equalTo(@(ITEM_SIZE));
make
.centerY.equalTo(_containerView
.mas_centerY);
make
.centerX.equalTo(_containerView
.mas_right)
.multipliedBy(((
CGFloat)i +
1) / ((
CGFloat)ITEM_COUNT +
1));
}];
}
方法四: 利用透明等宽度的SpaceView实现等间距
UIView *lastSpaceView = [
UIView new];
lastSpaceView
.backgroundColor = [
UIColor greenColor];
[_containerView1 addSubview:lastSpaceView];
[lastSpaceView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.and.top.and.bottom.equalTo(_containerView1);
}];
for (
NSUInteger i =
0; i < ITEM_COUNT; i++) {
UIView *itemView = [
self getItemViewWithIndex:i];
[_containerView1 addSubview:itemView];
[itemView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.height.and.width.equalTo(@(ITEM_SIZE));
make
.left.equalTo(lastSpaceView
.mas_right);
make
.centerY.equalTo(_containerView1
.mas_centerY);
}];
UIView *spaceView = [
UIView new];
spaceView
.backgroundColor = [
UIColor greenColor];
[_containerView1 addSubview:spaceView];
[spaceView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.equalTo(itemView
.mas_right)
.with.priorityHigh();
make
.top.and.bottom.equalTo(_containerView1);
make
.width.equalTo(lastSpaceView
.mas_width);
}];
lastSpaceView = spaceView;
}
[lastSpaceView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.right.equalTo(_containerView1
.mas_right);
}];
5. 动态改变字体宽度
和面方法4一样,利用spaceView来实现
UIView* bgView = [[
UIView alloc]init];
bgView
.backgroundColor = [
UIColor yellowColor];
[
self.view addSubview:bgView];
[bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.and.right.mas_equalTo(
0);
make
.top.mas_equalTo(@
100);
make
.height.mas_equalTo(@
100);
}];
listText = @[
@"北京",
@"地大吴波啊",
@"你大爷",
@"我们的爱哎哎"];
UIView *lastSpaceView =
nil;
for(
int i =
0 ; i < listText
.count; i ++)
{
UILabel* label = [
UILabel new];
label
.text = listText[i];
label
.backgroundColor = RANDOMCOLOR;
[bgView addSubview:label];
UIView* lineView = [
UIView new];
lineView
.backgroundColor = [
UIColor redColor];
[bgView addSubview:lineView];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make
.top.bottom.mas_equalTo(
0);
if (lastSpaceView)
{
NSLog(
@"存在 lastView");
make
.left.equalTo(lastSpaceView
.mas_right)
.mas_offset(@
20);
}
else
{
NSLog(
@"不存在存在 lastView");
make
.left.equalTo(bgView
.mas_left);
}
make
.height.equalTo(bgView);
}];
lastSpaceView = label;
[lineView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.top.and.bottom.mas_equalTo(
0);
make
.width.mas_equalTo(
1);
make
.left.mas_equalTo(label
.mas_right)
.mas_offset(@
10);
}];
}
效果图:
6. 父视图的高度,是里面俩控件高度的和
UIView* bgView = [
UIView new];
bgView
.backgroundColor = [
UIColor purpleColor];
[
self.view addSubview:bgView];
UILabel* titleLab = [
UILabel new];
titleLab
.backgroundColor = [
UIColor redColor];
titleLab
.textAlignment =
NSTextAlignmentCenter;
titleLab
.font = [
UIFont systemFontOfSize:
15.f];
titleLab
.text =
@"曹操——《短歌行》";
[bgView addSubview:titleLab];
UILabel* contentLab = [
UILabel new];
contentLab
.numberOfLines =
0 ;
contentLab
.textAlignment =
NSTextAlignmentCenter;
contentLab
.backgroundColor = [
UIColor brownColor];
contentLab
.font = [
UIFont systemFontOfSize:
13.f];
contentLab
.text =
@" 对酒当歌,人生几何? 譬如朝露,去日苦多。\n 慨当以慷,忧思难忘。 何以解忧?唯有杜康。\n 青青子衿,悠悠我心。 但为君故,沉吟至今。\n 呦呦鹿鸣,食野之苹。 我有嘉宾,鼓瑟吹笙。\n 明明如月,何时可掇? 忧从中来,不可断绝。\n 越陌度阡,枉用相存。 契阔谈宴,心念旧恩。\n 月明星稀,乌鹊南飞。 绕树三匝,何枝可依?\n 山不厌高,海不厌深。 周公吐哺,天下归心。";
[bgView addSubview:contentLab];
__
weak typeof(
self) weakSelf =
self;
[bgView mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.mas_offset(@
30);
make
.right.mas_offset(@-
30);
make
.centerY.equalTo(weakSelf
.view);
}];
[titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.top.right.mas_equalTo(@
0);
}];
[contentLab mas_makeConstraints:^(MASConstraintMaker *make) {
make
.left.right.mas_equalTo(@
0);
make
.top.equalTo(titleLab
.mas_bottom)
.mas_offset(@
10);
make
.bottom.equalTo(bgView);
}];
效果图:
以后慢慢更新,记录方便以后使用