杏z学習帳
Swiftを中心にFlutterやらUnityなどに手を出してます

AVPlayerViewController で謎の AutoLayout 制約エラー(2018/04/10)

AVPlayerViewController で謎の AutoLayout 制約エラー

内容はタイトルの通りで、別に回避策もなにもなくただの愚痴です(汗)

AVPlayerViewControllerを使って動画再生させているんだけど謎のAutoLayout制約エラーがでて気になりすぎるんだが...

です

環境

本題

とりあえずやりたかったことは...
AVPlayerViewControllerをそのままつかうのではなくて、
とあるUIViewのなかに表示させる形で使いたいっていうもの。
ってことで、下記のように組んでみました。

class ViewController: UIViewController {

    @IBOutlet weak var playerViewContainer: UIView!
    
    private let playerViewController: AVPlayerViewController = AVPlayerViewController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let bundlePath = Bundle.main.path(forResource: "movie", ofType: "mp4") else {
            return
        }
        
        self.playerViewController.player = AVPlayer(url: URL(fileURLWithPath: bundlePath))
        self.playerViewController.view.translatesAutoresizingMaskIntoConstraints = false
        self.playerViewController.videoGravity = AVLayerVideoGravity.resizeAspect.rawValue
        self.playerViewController.view.frame = self.view.bounds
        self.addChildViewController(self.playerViewController)
        self.playerViewContainer.addSubview(self.playerViewController.view)
        self.playerViewController.didMove(toParentViewController: self)
        NSLayoutConstraint.activate([
            self.playerViewController.view.topAnchor.constraint(equalTo: self.playerViewContainer.topAnchor),
            self.playerViewController.view.leftAnchor.constraint(equalTo: self.playerViewContainer.leftAnchor),
            self.playerViewController.view.rightAnchor.constraint(equalTo: self.playerViewContainer.rightAnchor),
            self.playerViewController.view.bottomAnchor.constraint(equalTo: self.playerViewContainer.bottomAnchor),
        ])
        self.playerViewController.player?.play()
    }
}

ざっくり書くと...

AVPlayerViewController.viewを対象のUIView.addSubview()とすることで、そこで表示ができるでしょ?というノリです。

実際、これで良い感じに再生されます💪

ところが Xcode の Debug area の方には Auto layout の制約エラーがでまくりです。

[LayoutConstraints] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it.( "", "", "", "", "" ) > > Will attempt to recover by breaking constraint > > > Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in may also be helpful. `UIView`に追加しているとこで、なにかしらこわれるのか?🤔 とかおもって、ごにょごにょしても全然消えなかったので、ちょっと普通の使い方してみました。 普通の画面と同じように、`AVPlayerViewController`に遷移しちゃう方法です。 ```swift guard let bundlePath = Bundle.main.path(forResource: "movie", ofType: "mp4") else { return } self.playerViewController.player = AVPlayer(url: URL(fileURLWithPath: bundlePath)) self.playerViewController.videoGravity = AVLayerVideoGravity.resizeAspect.rawValue self.present(self.playerViewController, animated: true, completion: nil) ``` ...だめでした。これでも同じようにエラーがでる。 ってことで、僕の中での結論は`AVPlayerViewController`のバグということに まぁ、表示崩れも特になく動いているとおもうので全然いいのですけど、 すごく気になりますし、すごく邪魔ですよね...(汗) なにか解決策をしっているかたは教えて欲しい... ## 参考 [Building a Basic Playback App - developer.apple.com](https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/GettingStarted/GettingStarted.html) ここにあるのをコピペしても出るんだからもうしゃーない感ある