Xcode 10 / iOS 12中未遵守锚定约束

时间:2018-09-19 02:35:35

标签: swift autolayout

昨天所有这些都在Xcode 9和iOS 11下起作用;但是,在更新到Xcode 10和iOS 12之后,该视图将不再显示。我正在视图中显示视频。今天,我可以听到但看不到视频。我检查了框架,发现它为零,这说明了问题。但是,与以前的版本相比,没有任何变化。我删除了视频内容,并在应用锚定约束且它们全部为零之后,仅查看了视图的框架。

import UIKit
import AVKit

class VideoView: UIView {

private var videoURL:URL!
private var parentView:UIView!
private var avPlayer:AVPlayer!
private var avPlayerLayer:AVPlayerLayer!

init(url:URL, parentView:UIView) {
    super.init(frame: .zero)

    self.videoURL = url
    self.parentView = parentView

    setup()
}

private func setup() {
    self.translatesAutoresizingMaskIntoConstraints = false
    self.parentView.addSubview(self)

    self.topAnchor.constraint(equalTo: self.parentView.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
    self.leadingAnchor.constraint(equalTo: self.parentView.leadingAnchor, constant: 8).isActive = true
    self.trailingAnchor.constraint(equalTo: self.parentView.trailingAnchor, constant: -8).isActive = true
    self.heightAnchor.constraint(equalToConstant: 200).isActive = true

    print(self.parentView.frame)
    print(self.frame)
}


override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
}

请注意setup()末尾的两个打印语句。 parentView返回0,0,414,736self视图返回0,0,0,0

如果在Init中设置帧大小,它将遵循该大小;但是,它不应用锚点约束,因此视图的大小将保持不变,无论我将其放入什么init中。

似乎根本没有考虑锚约束。调试器中没有关于它们的错误,我们可以看到,translatesAutoresizingMaskIntoConstraints设置为false,并且所有约束都将isActive设置为true

仅Xcode和iOS版本已更改。我想念什么?

更新1:

如果我创建标签并将其添加到self,则该标签将显示正常。如果我为self创建背景色,也​​可以很好地显示背景色,包括通过锚定约束设置的适当高度。但是,帧保持为零。因此,当尝试通过将其框架设置为AVPlayerLayer的边界来添加self时,由于self始终为零,因此它不起作用。因此,问题仍然是为什么初始化后框架的尺寸没有改变。

更新2:

我在应用锚定约束后立即添加了self.layoutIfNeeded(),这似乎已经解决了问题。尽管看了self的框架,但我得到了-199,-100,398,200不能说我理解X and Y的值。尽管layOutIfNeeded似乎已经解决了这个问题,但是为什么Xcode 10 / iOS 12要求这样做也是一个谜。

1 个答案:

答案 0 :(得分:2)

我在第二次更新中发布了似乎是答案的,但是为了清楚起见:

我在应用锚定约束后立即添加了self.layoutIfNeeded(),这似乎已经解决了问题。尽管查看自我框架,但我得到-199,-100,398,200不能说我了解X and Y的值。尽管如此,尽管为什么在Xcode 10 / iOS 12中要求这么做,layoutIfNeeded似乎已经解决了这个问题。