2016-06-30 60 views
5

ho visualizzato il pulsante AirPlay utilizzando questo codiceiOS Airplay - "Riproduzione sul televisore"

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() 

Ora, voglio visualizzare una schermata. C'è un metodo predefinito nel framework Airplay di iOS per visualizzarlo. O devo progettare lo schermo da solo. Inoltre, non ci sono delegati per verificare quando il dispositivo è collegato e il film inizia lo streaming su AppleTV tramite dispositivo iOS. Ho solo una variabile da verificare i 01e externalPlaybackActive

Il problema è che se utilizzo la variabile non sarebbe una soluzione efficiente in quanto è possibile collegare l'airplay da Control durante la riproduzione. Non voglio eseguire un timer per controllare dopo ogni secondo se il film è in streaming su AppleTV. Qualche idea migliore?

Questo video è in riproduzione su "Apple TV"

Ti piace questa image

risposta

2

Ecco come l'ho implementato. Esso funziona magicamente !

//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) 
     } 
    } 

// Setup 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

non si mostra anche quello che 'self.setUpAirPlayView()' fa. Hai seguito il mio suggerimento e hai usato 'contentOverlayView'? – JAL

+0

Sì, l'ho fatto e non ha funzionato. Non c'è un membro chiamato 'contentOverlayView'. Sto usando AVPlayer. self.setUpAirPlayView() è solo una funzione per visualizzare una vista in cima alla vista del mio lettore. Pubblicherà anche quella funzione. –

+0

Giusto, è per questo che ho detto che avrebbe funzionato se si stesse usando un 'AVPlayerViewController', non si specificava che si stesse usando un' AVPlayer'. – JAL

0

Sembra che si sta utilizzando un AVPlayerViewController, che ha una proprietà contentOverlayViewUIView che si trova tra il lettore video e i controlli.

È possibile iniziare inserendo un osservatore delle proprietà su externalPlaybackActive per sapere quando viene avviata la riproduzione AirPlay. Una volta che il valore è vero, inizializza il tuo UIView, aggiungilo sotto forma di sottomenu del contentOverlayView del tuo giocatore e posizionalo in una posizione.

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