针对多个显示内容空间不定内容长度的显示问题
在开发中有的时候回遇到一些比较操蛋的数据长度不定,但是需要用多个lable在同一行显示的问题,有的内容必须要显示全,有些则在到达一定长度之后剩余内容允许以...的形式省略显示。针对这样的问题需要借助Autolayout来完成。为了便利操作可以采用Masonry来进行约束操作。
Content Hugging 和 Content Compression Resistance
这两个属性对有intrinsic content size的控件(例如button,label)非常重要。通俗的讲,具有intrinsic content size的控件自己知道(可以计算)自己的大小,例如一个label,当你设置text,font之后,其大小是可以计算到的。关于intrinsic content size官方的解释:
Custom views typically have content that they display of which the layout system is unaware. Overriding this method allows a custom view to communicate to the layout system what size it would like to be based on its content. This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.
好了,了解了intrinsic content size的概念之后,下面就重点讨论Content Hugging 和 Content Compression Resistance了。
UIView中关于Content Hugging 和 Content Compression Resistance的方法有:
- ([UILayoutPriority](http://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/NSLayoutConstraint/NSLayoutConstraint.html#//apple_ref/doc/c_ref/UILayoutPriority))contentCompressionResistancePriorityForAxis:([UILayoutConstraintAxis](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/c_ref/UILayoutConstraintAxis))axis
- (void)setContentCompressionResistancePriority:([UILayoutPriority](http://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/NSLayoutConstraint/NSLayoutConstraint.html#//apple_ref/doc/c_ref/UILayoutPriority))priority forAxis:([UILayoutConstraintAxis](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/c_ref/UILayoutConstraintAxis))axis
- ([UILayoutPriority](http://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/NSLayoutConstraint/NSLayoutConstraint.html#//apple_ref/doc/c_ref/UILayoutPriority))contentHuggingPriorityForAxis:([UILayoutConstraintAxis](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/c_ref/UILayoutConstraintAxis))axis
- (void)setContentHuggingPriority:([UILayoutPriority](http://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/NSLayoutConstraint/NSLayoutConstraint.html#//apple_ref/doc/c_ref/UILayoutPriority))priority forAxis:([UILayoutConstraintAxis](http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/c_ref/UILayoutConstraintAxis))axis
大概的意思就是设置优先级的。
Hugging priority 确定view有多大的优先级阻止自己变大。
Compression Resistance priority确定有多大的优先级阻止自己变小。
** 并排两个label,宽度由内容决定。父级View宽度不够时,优先显示左边label的内容**
遇到这种跟内容压缩、优先级有关的布局,就不得不提Autolayout中的两个重要的属性“Content Compression Resistance”和“Content Hugging”。
Content Compression Resistance = 不许挤我!
对,这个属性说白了就是“不许挤我”=。=
这个属性的优先级(Priority)越高,越不“容易”被压缩。也就是说,当整体的空间装不小所有的View的时候,Content Compression Resistance优先级越高的,现实的内容越完整。
Content Hugging = 抱紧!
这个属性的优先级越高,整个View就要越“抱紧”View里面的内容。也就是View的大小不会随着父级View的扩大而扩大。
分析
根据要求,可以将约束分为两个部分:
整体空间足够时,两个label的宽度由内容决定,也就是说,label的“Content Hugging”优先级很高,而且没有固定的Width属性。
整体空间不够时,左边的label更不容易被压缩,也就是“Content Compression Resistance”优先级更高。
重点:
label不设置具体的宽度(width)属性,宽度由内容决定。
显示的优先级由“Content Compression Resistance”属性的高低决定。
参考:https://www.jianshu.com/p/62c5bdef1055
实战:
label1是左边的label,label2是右边的.
//设置label1的content hugging 为1000
//设置label1的content compression 为1000
//设置右边的label2的content hugging 为1000
//设置右边的label2的content compression 为250