iOS的一个小技巧——AutoLayout约束的优先级
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS的一个小技巧——AutoLayout约束的优先级相关的知识,希望对你有一定的参考价值。
参考技术A AutoLayout中添加的约束也有优先级,优先级的数值是1~1000。分为两种情况:多说无益,举个栗子来感受一下
场景还原,工作中我们常常会碰到这种需求,并排放置两个Label,左边的Label宽度根据内容适应,右边的Label距离左边Label有个固定距离,距离屏幕右边有个固定距离,在不设置优先级的情况下,我们会经常遇到奇怪的现象,要么左边的Labe被拉伸,要么被压缩,比如下图
我们设置左边Label的抗压缩优先级和抗拉伸优先级都大于右边Label,效果如图
在AutoLayout - iOS中,约束计数总是变为零
答案
使用此代码(Swift 4+和Xcode 9.4.1)
import UIKit
class ViewController: UIViewController {
@IBOutlet var subView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
print(self.view.getAllConstraints().count)
print(self.subView.getAllConstraints().count)
}
}
extension UIView {
func getAllConstraints() -> [NSLayoutConstraint] {
var views = [self]
var view = self
while let superview = view.superview {
views.append(superview)
view = superview
}
return views.flatMap({ $0.constraints }).filter { constraint in
return constraint.firstItem as? UIView == self ||
constraint.secondItem as? UIView == self
}
}
}
另一答案
试着在viewDidAppear
中打印约束。在viewDidLoad
方法约束中没有为视图加载,所以只需尝试使用viewDidAppear
方法。
另一答案
对于viewDidLoad被称为subviews的你的信息还没有列出那就是为什么你得到零,把代码放到viewDidLayoutSubviews
你会得到你的约束
以上是关于iOS的一个小技巧——AutoLayout约束的优先级的主要内容,如果未能解决你的问题,请参考以下文章