当我们使用纯代码方式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. WPF之坑——surface触控失灵之谜

    本次又遇到了WPF编写触控程序的一个问题,虽然已解决,但原因确搞不太明白,希望有大神看到这篇文章帮我解答. 在项目中实现了自己定义的icommandsource,因为需要对触控有特殊需求,控件对鼠标与 ...

  2. Jmeter——参数化的9种方法

    本文由作者张迎贞授权网易云社区发布. 一.用户定义的变量 1.右键快捷菜单中选择 添加-配置元件-用户自定义变量. 用户自定义变量中的定义的所有参数的值在测试计划的执行过程中不能发生取值的改变,因此一 ...

  3. Day 49 CSS样式.

    外部样式 1.元素选择器 /*1. 元素选择器*/p{ color :red} <p>1.我是一个p标签</p> 2.ID选择器 /*2 ID 选择器*/#p{ color : ...

  4. Weekly Contest 132

    1025. Divisor Game Alice and Bob take turns playing a game, with Alice starting first. Initially, th ...

  5. 【2019】OCP 12c 062题库更新大量新题-7

    7.daily_ords_lst is created in locally managed tablespace ORDERS_TBS which uses automatic segment sp ...

  6. 使用hex编码绕过主机卫士IIS版本继续注入

    本文作者:非主流 测试文件的源码如下: 我们先直接加上单引号试试: http://192.168.0.20/conn.asp?id=1%27 很好,没有报错.那我们继续,and 1=1 和and 1= ...

  7. 查看SMB服务器用户

    查看SMB服务器用户:pdbedit -L 查看SMB服务器运行状态:service smb status

  8. Storm Trident状态

    Trident中有对状态数据进行读取和写入操作的一流抽象工具.状态既可以保存在拓扑内部,比如保存在内容中并由HDFS存储,也可以通过外部存储(比如Memcached或Cassandra)存储在数据库中 ...

  9. sublime text3 --前端工程师必备

    sublime text3 --前端工程师必备神器 导读目录: 下载与Emmet插件安装 sublime text3 中cssrem安装与使用 sublime Text 3的中文文件名显示为方框的问题 ...

  10. Java之IO(十)Reader和Writer

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7071733.html 1.前言 之前的章节已经将Java8的io包中的字节流介绍完毕了.本章开始介绍Java的I ...