我有一个 .xib 文件,其中包含我想用来播放视频文件的 View 。该 View 具有配置其大小和位置的约束。现在我需要获取这些来配置我的视频播放器:
let slide1: OnboardingSlide = Bundle.main.loadNibNamed("OnboardingSlide", owner: self, options: nil)?.first as! OnboardingSlide
if let path = Bundle.main.path(forResource: "Onboarding_01", ofType: "mp4") {
let videoURL = URL(fileURLWithPath: path)
slide1.videoPlayer = AVPlayer(url: videoURL)
let playerLayer = AVPlayerLayer(player: slide1.videoPlayer)
playerLayer.frame = slide1.videoView.bounds // <-- this does not work
slide1.layer.addSublayer(playerLayer)
slide1.videoPlayer?.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: slide1.videoPlayer?.currentItem, queue: .main) { _ in
slide1.videoPlayer?.seek(to: CMTime(seconds: 0, preferredTimescale: 1))
slide1.videoPlayer?.play()
}
}
但是slide1.videoView.bounds
仅包含应用约束之前的矩形。我怎样才能得到实际的大小和位置?
最佳答案
您可以尝试通过调用强制布局机计算大小和位置:
setNeedsLayout()
layoutIfNeeded()
例如:
...
slide1.videoPlayer = AVPlayer(url: videoURL)
let playerLayer = AVPlayerLayer(player: slide1.videoPlayer)
setNeedsLayout()
layoutIfNeeded()
...
或者只是尝试在layoutSubviews()
中捕获slide1.videoPlayer的正确大小
关于应用约束后快速获取 View 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54866889/