2016-05-07 20 views
5

Sto giocando video nella mia app Swift (iOS 9) con il seguente codice:AVPlayerController: Schermo intero Autolayout emette

 let fileUrl = NSBundle.mainBundle().URLForResource("welcome", withExtension: ".mp4") 
     videoItem = AVPlayerItem(URL: fileUrl!) 
     videoPlayer = AVPlayer(playerItem: videoItem) 
     videoPlayer.addObserver(self, forKeyPath: "rate", options: [.New], context: nil) 

     videoPlayerController.player = videoPlayer 
     videoPlayerController.showsPlaybackControls = false 

     videoPlayerController.view.frame = CGRectMake(0, 0, playerView.frame.size.width, playerView.frame.size.height) 
     playerView.insertSubview(videoPlayerController.view, belowSubview: videoCoverView) 

     videoPlayerController.willMoveToParentViewController(self) 
     addChildViewController(videoPlayerController) 
     videoPlayerController.didMoveToParentViewController(self) 

     playerView.bringSubviewToFront(btnPlay) 

     let asset = AVAsset(URL: fileUrl!) 
     let imageGenerator = AVAssetImageGenerator(asset: asset) 
     let time = CMTime(seconds: asset.duration.seconds/2.0, preferredTimescale: 1) 

     do { 
      let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil) 
      let coverImage = UIImage(CGImage: imageRef) 
      videoCoverView.image = coverImage 
     } catch { 

     } 

videoPlayerController è un'istanza di AVPlayerViewController. playerView viene aggiunto tramite lo storyboard e ha l'impostazione di Autolayout su di esso. Affronto i problemi di Autloayout una volta che i controlli del player di AVPlayerViewController vengono visualizzati e anche quando provo ad andare in modalità a schermo intero tramite i controlli del player. Ecco il log che viene stampato.

2016-05-07 15:18:19.325 VoxTrain[2085:66307] 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. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x7fb6a2a3f2c0 h=-&- v=-&- _UIBackdropContentView:0x7fb6a2a02310.width == _UIBackdropView:0x7fb6a053bf90.width>", 
    "<NSLayoutConstraint:0x7fb6a2992800 H:|-(14)-[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing'] (Names: '|':_UIBackdropContentView:0x7fb6a2a02310)>", 
    "<NSLayoutConstraint:0x7fb6a2992850 H:[UILabel:0x7fb6a2991220'Hi-Speed Scrubbing']-(14)-| (Names: '|':_UIBackdropContentView:0x7fb6a2a02310)>", 
    "<NSLayoutConstraint:0x7fb6a29649a0 H:|-(0)-[_UIBackdropView:0x7fb6a053bf90] (Names: '|':UIView:0x7fb6a0549220)>", 
    "<NSLayoutConstraint:0x7fb6a298b8a0 H:[_UIBackdropView:0x7fb6a053bf90]-(0)-| (Names: '|':UIView:0x7fb6a0549220)>", 
    "<NSLayoutConstraint:0x7fb6a296f440 H:|-(0)-[UIView:0x7fb6a0549220] (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0)>", 
    "<NSLayoutConstraint:0x7fb6a296f490 H:[UIView:0x7fb6a0549220]-(0)-| (Names: '|':AVAlphaUpdatingView:0x7fb6a053dae0)>", 
    "<NSLayoutConstraint:0x7fb6a2a40cc0 'UIView-Encapsulated-Layout-Width' H:[AVAlphaUpdatingView:0x7fb6a053dae0(0)]>" 
) 

Dopo l'impostazione iniziale, ho cercato di impostare autolayout su videoPlayerController's vista con l'impostazione translatesAutoresizingMaskIntoConstraints false. Ma il problema persiste ancora. Come posso risolvere questi problemi?

+0

Duplicate: http://stackoverflow.com/q/32860362/2415822 – JAL

risposta

-1

Il problema è che si cerca di impostare showsPlaybackControls = true quando l'AVPlayerController è sullo schermo. Ciò consente di creare elementi dell'interfaccia utente del sistema, che portano a problemi di layout automatico.

Docs sono molto specifiche su questo punto:

Non utilizzare questa proprietà per modificare la visibilità delle riproduzione controlli mentre il controller della vista giocatore è sullo schermo, perché facendo modo si crea o distrugge elementi dell'interfaccia utente.

Link: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVPlayerViewController_Class/#//apple_ref/occ/instp/AVPlayerViewController/showsPlaybackControls

+0

@Abid Sto affrontando lo stesso problema. Hai qualche soluzione? –

+0

ho creato un'istanza AVPlayerViewController e ha aggiunto a una visione in questo modo: MoviePlayer = AVPlayerViewController.init() MoviePlayer .allowsPictureInPicturePlayback = false MoviePlayer .showsPlaybackControls = true MoviePlayer .player = AVPlayer.init (url???: ! elemento .mediaURL) MoviePlayer .view.translatesAutoresizingMaskIntoConstraints = false .Vedere contentView.addSubview (MoviePlayer) MoviePlayer .view.pinAllAnchors (a:!?!! contentView) '' ' io ancora vedo problemi di layout automatico quando ho andare a schermo intero e ritorno. –

0

utilizzare questo codice,

viewDidLoad metodo:

 let type : String! = "mp4" 
     let targetURL : String? = NSBundle.mainBundle().pathForResource("Welcome", ofType: type) 

     let videoURL = NSURL(fileURLWithPath:targetURL!) 


     let player = AVPlayer(URL: videoURL) 
     let playerController = AVPlayerViewController() 

     playerController.player = player 
     self.addChildViewController(playerController) 
     self.playView.addSubview(playerController.view) 
     playerController.view.frame = playView.bounds 

     player.play() 

E la mia Storyboard è dare seguito,

enter image description here

ho creare l'UIView, quindi impostare la parte superiore, sinistra, destra e Altezza che risolvono. il suo lavoro per me

Spero proprio utile

+0

Nope. Sto già facendo tutte queste cose solo in un ordine diverso. L'unica differenza è che l'altezza del mio PlayerView è proporzionale alla vista di ViewController. Il video funziona senza intoppi. L'unico problema si verifica quando si tenta di mostrare i controlli nativi di AVPlayerViewCOntroller impostando la proprietà showsPlaybackControls true. E ora Se si tenta di andare a schermo intero utilizzando questi controlli, il log di Autolayout viene stampato sulla console. –