昨天所有这些都在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,736
。 self
视图返回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要求这样做也是一个谜。
答案 0 :(得分:2)
我在第二次更新中发布了似乎是答案的,但是为了清楚起见:
我在应用锚定约束后立即添加了self.layoutIfNeeded()
,这似乎已经解决了问题。尽管查看自我框架,但我得到-199,-100,398,200
不能说我了解X and Y
的值。尽管如此,尽管为什么在Xcode 10 / iOS 12中要求这么做,layoutIfNeeded似乎已经解决了这个问题。