当我们使用纯代码方式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: metrics:nil views:dict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vf1 options: 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值
 
 
 
所有约束信息:
 
 

 
上面的约束信息是对应的,比如约束1:self.navBar 依赖于self.view,因而firstItem是self.navBar,secondItem是self.view。约束类型是边界所以firstAttribute和secondAttribute都是。和下面的约束条件刚刚好对应。
 
 

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

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

NSLayoutConstraint 遍历查找对应的约束的更多相关文章

  1. Perl遍历查找文件

    Perl遍历查找文件 使用Perl查找当前目录下的所有PDF文件 ******************************************************************* ...

  2. svn-checkout后,循环遍历查找包含某字符串的文件

    这里涉及几个知识点: 1.安装subversion,不多说了,网上有教程 2.循环遍历所有目录层级,找相 关文件 #!/bin/bash #########svn checkout项目出来 svn_d ...

  3. DOM遍历查找结点

    一.遍历API(2个) 1.深度优先原则遍历NodeIterator 节点迭代器 创建遍历API对象: var iterator=document.createNodeIterator(开始的父节点对 ...

  4. 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  5. 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发

    import java.util.Scanner; public class Test21 { public static void main(String[] args) { //定义并初始化数组 ...

  6. QHBoxLayout 、QFormLayout 遍历子部件,查找QLineEdit控件

    布局如下: QLineEdit * edit1 = new QLineEdit; QLineEdit * edit2 = new QLineEdit; QLineEdit * edit3 = new ...

  7. iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

    iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...

  8. iOS-原生纯代码约束总结(二)之 AutoLayout

    一,概述 AutoLayout相比AutoResizing更加实用,是可以完全替代AutoResizing的一种自动布局方式.而在使用AutoLayout前,我们必须理解一个属性,那就是transla ...

  9. IOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 转载

    http://blog.csdn.net/he_jiabin/article/details/48677911 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为 ...

随机推荐

  1. oh-my-zsh 安装及使用

    什么是 oh-my-zsh oh-my-zsh 是基于 zsh 的功能做了一个扩展,方便的插件管理.主题自定义,以及漂亮的自动完成效果. oh-my-zsh 安装及插件安装 查看系统中 zsh 及版本 ...

  2. 【转载】Chrome 0day漏洞:不要用Chrome查看pdf文件

    英文原文地址:https://blog.edgespot.io/2019/02/edgespot-detects-pdf-zero-day-samples.html 中文原文地址:https://ww ...

  3. node 无脑生成小程序二维码图

    RT 新建createwxaqrcode.js: const request = require('request') const fs = require('fs') // eg:生成购物车列表圆形 ...

  4. sublime text3---Emmet:HTML/CSS代码快速编写神器

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  5. WebDriverAPI(4)

    单击某个元素 采用元素id.click()方法即可 双击某个元素id.doubleClick 操作单选下拉列表 测试网页HTML代码 <html> <body> <sel ...

  6. h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗

    这段时间一直在着手h5开发手机端聊天系统——html5仿微信聊天室,最近又在原先基础上开发了一个仿微信.微博网页web版聊天系统,使用到了HTML5+css3+jQuery+wcpop等技术开发,弹窗 ...

  7. Java枚举源码分析

    1.是一个范型类, 实现了Serializable和Comparable接口 2.只有两个成员变量:name.ordinal 3.枚举类隐含一个values函数,需通过反射调用才可获取枚举实例化对象列 ...

  8. Hadoop2.0.0+CDH4.5.0集群配置

    Hadoop 2.0.0-cdh4.5.0安装:http://blog.csdn.net/u010967382/article/details/18402217 CDH版本下载:http://arch ...

  9. 原生JavaScript的DOM操作方法总结

    什么是DOM? DOM即文档对象模型,Document Object Model.  是HTML和XML文档的编程接口.它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从 ...

  10. Git&GitHub学习日志

    Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理. Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件.作为一个 ...