自动布局技巧篇-巧妙使用优先级以及优先级的使用场景

在自动布局中使用优先级,除了上一篇自动布局技巧篇-Content Hugging Priority 和 Content Compression Resistance Priority讲到的防压缩或防拉伸情况下会使用,那么还有那些情况下会用到呢?

下面看一个场景,要求实现下面的效果:

假设三个视图分别是View1,View2,View3,最开始是view2距离view1二十个像素,view3距离view2二十个像素,而实际项目中,view2有时候有有时候没有,有的话就是正常情况,像上面三个排列,没有的话,view3会取代view2的位置距离view1二十个像素,

解决上面的问题有很多种方式,比如以下三种:

1 view3是基于view2,如果view2没有,隐藏view2,将view3与view2之间间距约束设为0,并将view2宽度约束设为0

2 view3不基于view2,而是基于view1,距离view1最开始一个距离disView3ToView1(20*2+view2的宽度),当view2没有的时候,隐藏view2,将disView3ToView1约束值设为20,

3 view3既基于view2,又基于view1,就是view3距离view2,view3距离view1都有一个距离为20的约束就是disView3ToView2,disView3ToView1,只不过刚开始view3到view2距离的优先级要高于view3到view1距离的优先级,即disView3ToView2的priority>disView3ToView1的priority,后面如果view2没有了,改变两个距离对应的优先级为,disView3ToView2的priority

前面两种方法本质上是一样的,都是改变约束的值,来改变位置,第三种方式而是通过改变约束优先级的方式实现,在一种情况下,这种约束满足,那么它的优先级就高,另外一种情况下,另一种约束满足,那么另一种约束优先级就高,显然这种场景下,采用优先级的方式更适合,

这里我们主要来看一下view3的约束:

点击其中view3到view2的约束

点击其中view3到view1的约束

注意:

上面本来默认添加一个约束的时候它的优先级是1000,那么按理来说上面那个999没必要改啊,直接让它使用默认值1000就可以啊,为什么我要改成999呢,或者为什么我不使用1000那个数值呢,是有原因的,因为后面我要改变这两个优先级(大的改小,小的改大),如果是1000的话,那么就意味着我可能会将1000改成小于1000的,小于1000的改成1000的,那么这样就会有问题,你用1000的话,你就会发现报下面的错误

原来,具有优先级1000(UILayoutPriorityRequired)的约束为强制约束(Required Constraint),优先级小于1000的约束为可选约束(Optional Constraint),而优先级的修改只允许在可选约束优先级范围内才能修改,换句话说:

不允许将优先级由小于1000的值改为1000

不允许将优先级由1000修改为小于1000的值

也就是只能在小于1000的范围内修改,

所以上面专门把1000改成了999,另一个则是998

下一步:把两个约束拖出来

@property(weak,nonatomic)IBOutletNSLayoutConstraint*view3ToView1Constraint;

@property(weak,nonatomic)IBOutletNSLayoutConstraint*view3ToView2Constraint;

然后修改即可

self.view3ToView1Constraint.priority=999;

self.view3ToView2Constraint.priority=998;

这是一种场景,下面还有一种场景,

要求:正常情况下,上面view和下面view,等宽等高,上面视图宽度变化,下面视图宽度也随着变化,但是下面视图有一个最大宽度250,到达了这个宽度后,便不再增大,

分析:

这里下面的view关键是两个约束

1 和上面的view等宽

2 最大宽度250

如果这两个约束优先级一样的话,那么当上面视图宽度超过250的时候,会报错,实际运行会出现未知情况,

所以两个约束必然要有一个优先级要高些,因为当宽度大于250的时候,最大宽度这个约束得起作用,肯定要比等宽的约束作用力度要大些,所以最大宽度约束的优先级>等宽约束的优先级,还是采用小于1000的形式,防止以后会改变它们,如下:

宽度约束:

等宽约束:

那么可以总结一下什么场景下该使用优先级了:

对于一个视图,正常情况下,它有一个约束constriant1,特殊情况下它又有一个约束constraint2,这个view不管现在处于哪一种情况,只可能是这两个约束中的一个起作用(不一定会相互冲突比如例子2,但同一种情况只可能是其中一个约束在起作用),那么这个时候这个约束的优先级就要高于另外一个,相反一样。

demo地址https://github.com/aszkj/KJAutoLayoutSillDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容