应用约束后快速获取 View 边界

标签 swift autolayout

我有一个 .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/

相关文章:

ios - 约束没有在 xcode 中更新

ios - 使用 UIStackView 的 UITableViewCell 的动态高度

ios - Swift 4 与 unity3d 5.6.6f2 的集成

memory - 切换 Storyboard场景时从内存中删除对象

ios - 根据 `UIView` `UILabel` 中的文本更改 `UITableViewCell` 宽度

ios - Swift3 iOS 在换行发生时设置 UITextView 高度

iOS 布局传递和约束更新

ios - 将核心数据实体发送到 FireBase?

ios - 当我尝试通过我的应用程序发送短信时,消息屏幕会自动取消

ios - setUp() 方法在调用每个测试方法之前是如何调用的?