iOS UIButton用约束调整imageView和titleLabel

在网上找的文章都是通过frame去设置的,对于用约束构建的项目不是很友好,今天决定解决下

经过一上午的实验,发现当开发人员 第一次设置UIButton的约束后
系统会自动生成UIButtonimageViewtitleLabel的约束 按照默认的左图右文字的方式
这时我们在更改或新增针对imageViewtitleLabel 的约束就会产生冲突

解决问题主要依靠以下知识点

  • Masonry 设定的约束会有标识 kInstalledConstraintsKey
  • mas_remakeConstraints 重置并重新设置约束 将removeExisting = YES 需注意只能重置Masonry设定的约束
  • titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
    imageView.translatesAutoresizingMaskIntoConstraints = NO;
    属性虽然设置成功 但没有用
  • 同级view之间的约束会添加在父视图上
  • 约束的获取和删除
关键代码如下即可任意调整 imageViewtitleLabel两者之间的位置(上下左右)

已测试10.3.1 和14.3系统

-(void)updateViewConstraints{

    NSLog(@"%s---%@",__func__,@"先刷新");

//     box属性为UIButton
//    NSLog(@"self.box.titleLabel.constraints = %@",self.box.titleLabel.constraints);
//    NSLog(@"self.box.imageView.constraints = %@",self.box.imageView.constraints);
//    NSLog(@"self.box.constraints = %@",self.box.constraints);
  
  ////***************
    [self.box removeConstraints:self.box.constraints];

    [self.box mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(10);
        make.right.mas_equalTo(-10);
        make.centerY.mas_equalTo(self.view);
        make.height.mas_equalTo(self.box.titleLabel.mas_height);
    }];
    NSLog(@"33333333");

    [self.box.titleLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(self.box.imageView.mas_right).offset(10).priority(1000);
        make.right.mas_equalTo(-10);


    }];

    NSLog(@"4444");
    [self.box.imageView mas_remakeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(0);
        make.centerY.mas_equalTo(self.box.mas_centerY);
        make.width.height.mas_equalTo(15);

    }];


//    NSLog(@"self.box.titleLabel.constraints0 = %@",self.box.titleLabel.constraints);
//    NSLog(@"self.box.titleLabel.constraints0 = 12312312");
//
//    NSLog(@"self.box.imageView.constraints0 = %@",self.box.imageView.constraints);
//    NSLog(@"self.box.constraints0 = %@",self.box.constraints);

    //刷新两次才搞定
    //_sendUpdateConstraintsIfNecessaryForSecondPass



    [super updateViewConstraints];
}

总结
  • 遇到问题要拆分
  • 程序员应当耐心,细致,理性

你可能感兴趣的:(iOS UIButton用约束调整imageView和titleLabel)