NSLayoutConstraint 遍历查找对应的约束

 
当我们使用纯代码方式Autolayout进行布局约束时,一个view上可能添加了很多的约束。而这些约束又不像view一样有一个可以区分的tag值,茫茫约束中想查到想要的约束然后进行更改,好像很难。
恰好最近项目有需求,所以在此记录一下纯代码Autolayout约束的遍历查找。
 

 
我们的项目中所有的导航栏都是自定义的导航条,然后对导航条进行VFL约束,下面是导航条添加约束的代码: 
 
[self.navBar setTranslatesAutoresizingMaskIntoConstraints:NO];
  
 NSDictionary *dict = NSDictionaryOfVariableBindings(_navBar);
 NSString *vf0 = @"|-0-[_navBar]-0-|";
 NSString *vf1 = [NSString stringWithFormat:@"V:|-0-[_navBar(%f)]",self.navHeight];
 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vf0 options:0 metrics:nil views:dict]];
 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vf1 options:0 metrics:nil views:dict]];
 

 
项目中有这样一个需求,当ScrollView向上滚动时需要动态改变导航条的高度值,由于采用VFL约束,在改变高度以及frame时都没有达到预期要求。
以前使用xib以及storyboard添加约束时用到过改变NSLayoutconstraint的constant属性可以改变约束。所以想通过这种方式改变导航条高度值
 

 
//获取self.view上的所有约束
NSArray *constraints = self.navBar.superview.constraints;
    for (NSLayoutConstraint *constraint in constraints) {
        debugLog(@"firstAttribute-- %ld  secondAttribute-- %ld",(long)constraint.firstAttribute,(long)constraint.secondAttribute);
        debugLog(@"firstItem--%@ secondItem--%@",[constraint.firstItem class],[constraint.secondItem class]);
       
    }
下面是我通过两次打印的log信息:
 
所有attribute 以及item值
 
NSLayoutConstraint 遍历查找对应的约束
 
 
所有约束信息:
 
NSLayoutConstraint 遍历查找对应的约束
 

 
上面的约束信息是对应的,比如约束1:self.navBar 依赖于self.view,因而firstItemself.navBar,secondItem是self.view。约束类型是边界所以firstAttributesecondAttribute都是5。和下面的约束条件刚刚好对应。
 
NSLayoutConstraint 遍历查找对应的约束
 

 
我们的需求是找到self.navBar的高度约束。这个约束依赖于self.view,所以firstItemself.navBar。约束类型是高度,所以firstAttributeNSLayoutAttributeHeight
用下面的Demo就可以达到我们的需求了。
 
NSArray *constraints = self.navBar.superview.constraints;
    for (NSLayoutConstraint *constraint in constraints) { 
        if (constraint.firstItem == self.navBar&&constraint.firstAttribute==NSLayoutAttributeHeight) {
            constraint.constant = 100;
        }
}

 


总结:firstItem 表示约束对象,secondItem 表示被依赖的对象。
     firstAttribute 指的是第一个约束条件的约束类型,secondAttribute 指的是第二个约束条件的约束类写(没有则为零)。
当我们需要遍历到一个约束时只需要对上面四个条件就行筛选就可以找到对应的NSLayoutConstraint对象