Swift 4 Невозможно одновременно удовлетворить ограничения при использовании AVPlayerViewController ()

Я программно добавляю вступительное видео для своего приложения. Я получаю следующие предупреждения. есть идеи, что я делаю не так? Я новичок в разработке Swift и iOS.

2018-04-19 13: 11: 56.295952 + 0200 [1779: 395252] [LayoutConstraints] Невозможно одновременно удовлетворить ограничения. Возможно, по крайней мере, одно из ограничений в следующем списке вам не нужно. Попробуйте следующее: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) найдите код, который добавил нежелательное ограничение или ограничения, и исправьте его. ("", "", "(активные, имена: '|': UIStackView: 0x15dd29110)>", "", "(активные, имена: '|': UIStackView: 0x15dd29110)>")

Попытка восстановиться, нарушив ограничение

Сделайте символическую точку останова в UIViewAlertForUnsatisfiableConstraints, чтобы отловить это в отладчике. Также могут быть полезны методы из категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в. 2018-04-19 13: 11: 56.296790 + 0200 [1779: 395252] [LayoutConstraints] Невозможно одновременно удовлетворить ограничения. Возможно, по крайней мере, одно из ограничений в следующем списке вам не нужно. Попробуйте следующее: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) найдите код, который добавил нежелательное ограничение или ограничения, и исправьте его. ("", "", "", "UILayoutGuide: 0x1d41bd180'UIViewLayoutMarginsGuide '
(активный, имена:' | ': UIStackView: 0x15dd29110)>", "(активный, имена:' | ': UIStackView: 0x15dd29110) > ")

Попытка восстановиться, нарушив ограничение

Сделайте символическую точку останова в UIViewAlertForUnsatisfiableConstraints, чтобы отловить это в отладчике. Также могут быть полезны методы из категории UIConstraintBasedLayoutDebugging в UIView, перечисленные в.

var movieController: AVPlayer?
let playerViewController = AVPlayerViewController()

override func viewDidLoad() {
    playVideo()
}

func playVideo() {
    let path = Bundle.main.path(forResource: appData.videoFile, ofType: appData.videoExtension)
    let url = URL(fileURLWithPath: path!)
    movieController = AVPlayer(url: url)
    NotificationCenter.default.addObserver(self, selector:#selector(movieFinished),name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: movieController?.currentItem)
    playerViewController.player = self.movieController
    playerViewController.delegate = self
    playerViewController.view.frame = self.view.bounds
    playerViewController.showsPlaybackControls = false
    playerViewController.videoGravity = "AVLayerVideoGravityResizeAspectFill"
    playerViewController.view.translatesAutoresizingMaskIntoConstraints = false
    playerViewController.player?.play()
    self.view.addSubview(playerViewController.view)
}

@objc func movieFinished() {
    let value = UIInterfaceOrientation.portrait.rawValue
    UIDevice.current.setValue(value, forKey: "orientation")
    UIViewController.attemptRotationToDeviceOrientation()
    UIView.animate(withDuration: 1.5, delay: 0, options: .curveEaseIn, animations: {
        self.playerViewController.view.alpha = 0.0
    }, completion: { (finished: Bool) in
        self.playerViewController.view.removeFromSuperview()
    })
}

person James Nicholson    schedule 19.04.2018    source источник
comment
попробуйте добавить это на viewWillAppear   -  person Lu_    schedule 19.04.2018
comment
@Lu_ спасибо, но я все равно получаю сообщение об ошибке даже после добавления функции переопределения viewWillAppear (_ animated: Bool) {super.viewWillAppear (animated) playVideo ()}   -  person James Nicholson    schedule 19.04.2018
comment
попробуйте также добавить представление, предназначенное для видео, а не размещать его playerViewController.view   -  person Lu_    schedule 19.04.2018
comment
Где вид стека? Добавьте символическую точку останова для невыполнимых ограничений (см. Сообщение об ошибке). Он остановится именно в том месте, где сломался. Всегда внимательно читайте ошибку, в ней есть подсказки относительно того, что не так и как определить проблему.   -  person user1046037    schedule 19.04.2018
comment
@ user1046037 ломается при добавлении игрока в подпредставление LOL! Я очень растерялся, помешает ли эта ошибка приложению в магазине приложений?   -  person James Nicholson    schedule 19.04.2018
comment
Вы добавили символическую точку останова? Вы используете какой-нибудь UIStackView?   -  person user1046037    schedule 19.04.2018
comment
Я решаю эту проблему, добавляя avPlayerLayer и avPlayerItem. я опубликую решение   -  person James Nicholson    schedule 20.04.2018


Ответы (1)


Я решаю эту проблему, используя AVPlayerLayer и AVPlayerItem.

var player:AVPlayer?
var playerItem:AVPlayerItem?
let playerLayer:AVPlayerLayer? = nil

override func loadView() {
    super.loadView()
    startWebiew()
}

func playVideo() {
    let path = Bundle.main.path(forResource: appData.videoFile, ofType: appData.videoExtension)
    let url = URL(fileURLWithPath: path!)
    let playerItem:AVPlayerItem = AVPlayerItem(url: url)
    player = AVPlayer(playerItem: playerItem)
    let playerLayer=AVPlayerLayer(player: player!)
    playerLayer.frame = view.bounds
    playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    playerLayer.player?.play()
    view.layer.addSublayer(playerLayer)

}
person James Nicholson    schedule 20.04.2018