2016-06-30 37 views
5

mam wyświetlony przycisk AirPlay używając tego koduiOS Airplay - „Odtwarzanie na ekranie telewizora”

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

Teraz chcę, aby wyświetlić ekran. Czy jest jakaś domyślna metoda w systemie iOS Airplay do jej wyświetlania. Albo sam muszę zaprojektować ekran. Ponadto nie ma delegatów, którzy mogliby sprawdzić, kiedy urządzenie jest podłączone, a film rozpocznie przesyłanie strumieniowe w AppleTV za pomocą urządzenia iOS. Mam tylko zmienną do sprawdzenia, tj. externalPlaybackActive

Problem polega na tym, że jeśli użyję tej zmiennej, nie będzie to wydajne rozwiązanie, ponieważ mogę sterować odtwarzaniem podczas odtwarzania. Nie chcę uruchamiać stopera, aby sprawdzać po każdej sekundzie, jeśli film jest przesyłany strumieniowo w AppleTV. Jakieś lepsze pomysły?

Ten film jest odtwarzany na „Apple TV”

Ci się to image

Odpowiedz

2

Tak to zrealizowałem. To działa jak urok !

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

// AirplayView Konfiguracja

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

Nawet nie pokazać, co 'self.setUpAirPlayView()' robi. Czy wziąłeś moją sugestię i skorzystałeś z 'contentOverlayView'? – JAL

+0

Tak, zrobiłem to i nie zadziałało. Nie ma członka o nazwie "contentOverlayView". Używam AVPlayera. self.setUpAirPlayView() to tylko funkcja wyświetlania widoku na górze widoku mojego odtwarzacza. Również opublikuje tę funkcję. –

+0

Tak, dlatego powiedziałem, że zadziała, jeśli używałeś 'AVPlayerViewController', nie określiłeś, że używasz' AVPlayer'. – JAL

0

Wygląda jak używasz AVPlayerViewController, która ma contentOverlayViewUIView właściwość, która znajduje się pomiędzy odtwarzaczem wideo i kontrole.

Można uruchomić poprzez oddanie mienia obserwatora na externalPlaybackActive wiedzieć, kiedy rozpocznie odtwarzanie AirPlay. Gdy wartość tej wartości jest prawdziwa, zainicjuj swój UIView, dodaj go jako podzbiór swojego odtwarzacza contentOverlayView i poisition it.

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