iOS的一个小技巧——AutoLayout约束的优先级

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS的一个小技巧——AutoLayout约束的优先级相关的知识,希望对你有一定的参考价值。

参考技术A AutoLayout中添加的约束也有优先级,优先级的数值是1~1000。分为两种情况:

多说无益,举个栗子来感受一下

场景还原,工作中我们常常会碰到这种需求,并排放置两个Label,左边的Label宽度根据内容适应,右边的Label距离左边Label有个固定距离,距离屏幕右边有个固定距离,在不设置优先级的情况下,我们会经常遇到奇怪的现象,要么左边的Labe被拉伸,要么被压缩,比如下图

我们设置左边Label的抗压缩优先级和抗拉伸优先级都大于右边Label,效果如图

在AutoLayout - iOS中,约束计数总是变为零

我得到一个奇怪的问题,我正在使用如下的故事板设置视图的约束:enter image description here

但是如果我通过代码访问所有应用的约束,那么总是得到零(0)。

enter image description here

对于self.view,它返回约束但黄色视图为零。

答案

使用此代码(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你会得到你的约束

Demo

以上是关于iOS的一个小技巧——AutoLayout约束的优先级的主要内容,如果未能解决你的问题,请参考以下文章

在AutoLayout - iOS中,约束计数总是变为零

一个iOS约束布局的小技巧

一个iOS约束布局的小技巧

iOS 在xib或者storyboard中添加AutoLayout后,在代码中修改AutoLayout约束条件

iOS -AutoLayout 约束集激活在第二次崩溃

iOS - XIB之AutoLayout添加约束