2016-06-30 1 views
5

J'ai affiché le bouton airplay en utilisant ce codeiOS Airplay - « Jouer sur votre téléviseur »

var airplayButton: UIBarButtonItem! 
let airView: MPVolumeView = MPVolumeView() 
airView.showsRouteButton = true 
airView.showsVolumeSlider = false 
airView.sizeToFit() 
airView.tintColor = UIColor.blackColor() 

airplayButton = UIBarButtonItem(customView: airView) 
airplayButton.tintColor = UIColor.whiteColor() 

Maintenant, je veux afficher un écran. Existe-t-il une méthode par défaut dans l'infrastructure iOS Airplay pour l'afficher. Ou je dois concevoir l'écran moi-même. En outre, il n'y a aucun délégué pour vérifier quand l'appareil est connecté et le film commence à diffuser sur AppleTV via iOS Device. J'ai seulement une variable à vérifier i.e externalPlaybackActive

Le problème est que si j'utilise la variable, ce ne serait pas une solution efficace car j'ai de l'airplay peut être connecté depuis Control pendant la lecture. Je ne veux pas lancer une minuterie pour vérifier chaque seconde si le film est diffusé sur AppleTV. De meilleures idées?

Cette vidéo joue sur "Apple TV"

Vous aimez cette image

Répondre

2

Voici comment je l'ai implémenté. Il fonctionne comme un charme !

//Airplay constants 

private var observerContextAirplay = 1 

private var propertyToObserveAirplay = "externalPlaybackActive" 

// MARK: AirPlay Key-value Observing 

    func startObservingForAirPlayStatusChanges() 
    { 
     self.player.moviePlayer.addObserver(self, forKeyPath: propertyToObserveAirplay, options: .New, context: &observerContextAirplay) 
    } 

    func stopObservingForAirPlayStatusChanges() 
    { 
     self.player.moviePlayer.removeObserver(self, forKeyPath: propertyToObserveAirplay) 
    } 

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
     if context == &observerContextAirplay { 
      if self.player.moviePlayer.externalPlaybackActive == true 
      {      
       self.setUpAirPlayView() 
      } 
      else if self.player.moviePlayer.externalPlaybackActive == false 
      { 
       self.resetPlayerView() 
      } 

     } 
     else { 
      super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     } 
    } 

// Configuration AirplayView

func setUpAirPlayView() 
{ 
    //Airplay Button 

    if self.airPlay_PlayBtn == nil 
    { 
     let playImage = UIImage(named: "player_play.png")! 
     if let _ = self.airPlay_PlayBtnFrame 
     { 
      self.airPlay_PlayBtn = UIButton(frame: self.airPlay_PlayBtnFrame) 
      self.airPlay_PlayBtn.setBackgroundImage(playImage, forState: UIControlState.Normal) 
      self.airPlay_PlayBtn.addTarget(self, action: #selector(ICFPlayerViewController.airPlayButtonAction), forControlEvents: UIControlEvents.TouchUpInside) 

      self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_play.png"), forState: .Normal) 
      self.airPlay_PlayBtn.setBackgroundImage(UIImage(named: "player_pause.png"), forState: .Selected) 
      self.airPlay_PlayBtn.center = self.view.center 

      self.view.addSubview(self.airPlay_PlayBtn) 
      if let _ = self.player 
      { 
       self.player.playPauseButton.hidden = true 
      } 
     } 
    } 
    else 
    { 
     self.airPlay_PlayBtn.hidden = false 
     if let _ = self.player 
     { 
      self.player.playPauseButton.hidden = true 
     } 
    } 

    // Airplay Label 
    if self.airPlayLabel == nil 
    { 
     self.airPlayLabel = UILabel() 
     self.airPlayLabel.frame = CGRectMake(0, 0, 280, 20) 

     self.airPlayLabel.text = "Your video is now playing on Apple TV" 
     self.airPlayLabel.textAlignment = NSTextAlignment.Center 
     self.airPlayLabel.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.6) 

     self.airPlayLabel.textColor = UIColor.whiteColor() 

     self.airPlayLabel.sizeToFit() 

     self.airPlayLabel.center = self.view.center 

     self.airPlayLabel.center.y = self.view.center.y - self.activityIndicator.frame.size.height*1.5 
     self.view.addSubview(self.airPlayLabel) 
    } 
    else 
    { 
     self.airPlayLabel.hidden = false 
    } 

    // Thumbnail 
    self.setupContentThumbnailImageView() //Fetch Thumbnail image 
    if let _ = self.thumbnailImage 
    { 
     self.view.addSubview(self.thumbnailImage) 
    } 

    self.view.bringSubviewToFront(bottomToolbar) 
    self.view.bringSubviewToFront(topToolbar) 

    if let _ = self.airPlayLabel 
    { 
     self.view.bringSubviewToFront(self.airPlayLabel) 
    } 
    if let _ = self.airPlay_PlayBtn 
    { 
     self.view.bringSubviewToFront(self.airPlay_PlayBtn) 
    } 

} 
+0

Vous ne montrez même pas ce que 'self.setUpAirPlayView()' fait. Avez-vous pris ma suggestion et utilisé 'contentOverlayView'? – JAL

+0

Ouais je l'ai fait et ça n'a pas marché. Aucun membre nommé 'contentOverlayView'. J'utilise AVPlayer. self.setUpAirPlayView() est juste une fonction pour afficher une vue en haut de la vue de mon lecteur. Publiera cette fonction aussi. –

+0

À droite, c'est pourquoi j'ai dit que cela fonctionnerait si vous utilisiez un 'AVPlayerViewController', vous n'avez pas spécifié que vous utilisiez un' AVPlayer'. – JAL

0

On dirait que vous utilisez un AVPlayerViewController, qui possède une propriété contentOverlayViewUIView qui se trouve entre le lecteur vidéo et les contrôles.

Vous pouvez commencer par mettre un observateur de propriété sur externalPlaybackActive pour savoir quand la lecture d'AirPlay commence. Une fois que la valeur de ceci est vraie, initialisez votre UIView, ajoutez-le comme une sous-vue de contentOverlayView de votre joueur, et empoisonnez-le.

let subview = UIView() // your view you want to show when AirPlay is active 
subview.frame = CGRect(...) 
playerVC.contentOverlayView?.addSubview(subview) 
playerVC.contentOverlayView?.bringSubviewToFront(subview)