2014-10-12 3 views

답변

4

AVPlayerViewController 인스턴스의 videoBounds 속성을 KVO를 사용하여 관찰 할 수 있습니다.

편집 되는 가장 기본적인 예를

[_myPlayerViewController addObserver:self forKeyPath:@"videoBounds" options:0 context:nil]; 
+0

ChrisH 플레이어 상태를 얻기 위해 KVO를 등록하는 코드를 찾을 수 있지만 videoBounds 변경을 알리는 keyPath를 찾을 수없는 것 같습니다. [self.playerViewController.player addObserver : self forKeyPath : @ "status"옵션 : 0 context : nil]; - @ "상태"대신에 무엇을 사용합니까? –

+0

@JohnStewart 당신은'playerViewController.player'의'status' 속성을 관찰하는 것에 대해 이야기하고 있습니다 .- playerViewController'의'videoBounds' 속성을 관찰 할 필요가 있습니다. – ChrisH

+0

완벽하게 작동합니다; 고맙습니다. ChrisH 락! –

0
self.frameChecker = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkContetnOverlay) userInfo:nil repeats:YES]; 



    -(void)checkContetnOverlay{ 

     BOOL currentPlayerIsFullscreen = (self.avVideoPlayer.contentOverlayView.frame.size.width>1000 || self.avVideoPlayer.contentOverlayView.frame.size.height>1000); 
    //works with these values only for iPad  


     if (((PlayerViewController*)self.parentViewController).playerIsInfullScreen != currentPlayerIsFullscreen) { 
      if (currentPlayerIsFullscreen) { 
       NSLog(@"CUSTOM PLAYER (av) : changed to fullscreen"); 

       self.avVideoPlayer.showsPlaybackControls = YES; 
      }else{ 
       NSLog(@"CUSTOM PLAYER (av) : changed to minimised"); 

       self.avVideoPlayer.showsPlaybackControls = YES; 
      } 
     } 
    } 
5

그것은 예를 들어, playerViewController.contentOverlayViewbounds을 관찰하고 [UIScreen mainScreen].bounds에 그 비교하는 것도 가능합니다 : 신속한에서

self.playerViewController = [AVPlayerViewController new]; 
// do this after adding player VC as a child VC or in completion block of -presentViewController:animated:completion: 
[self.playerViewController.contentOverlayView addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL]; 

... 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context { 
    if (object == self.playerViewController.contentOverlayView) { 
     if ([keyPath isEqualToString:@"bounds"]) { 
      CGRect oldBounds = [change[NSKeyValueChangeOldKey] CGRectValue], newBounds = [change[NSKeyValueChangeNewKey] CGRectValue]; 
      BOOL wasFullscreen = CGRectEqualToRect(oldBounds, [UIScreen mainScreen].bounds), isFullscreen = CGRectEqualToRect(newBounds, [UIScreen mainScreen].bounds); 
      if (isFullscreen && !wasFullscreen) { 
       if (CGRectEqualToRect(oldBounds, CGRectMake(0, 0, newBounds.size.height, newBounds.size.width))) { 
        NSLog(@"rotated fullscreen"); 
       } 
       else { 
        NSLog(@"entered fullscreen"); 
       } 
      } 
      else if (!isFullscreen && wasFullscreen) { 
       NSLog(@"exited fullscreen"); 
      } 
     } 
    } 
} 
+0

신속한 코드가 있습니까? – Piraba

+0

iOS 10에서 작동하지 않습니다 –

+0

@PavanMore는 iOS 10에서 제대로 작동하지만 iOS 9 SDK에서만 테스트했습니다 – kambala

4

, 오디오 및 동영상 용 :

는 viewDidLoad에, 또는 didMoveToSuperview로 초기화 기능이 관찰자를 추가

//Observe if player changed bounds and maybe went to fullscreen 
playerController.contentOverlayView!.addObserver(self, forKeyPath: "bounds", options: NSKeyValueObservingOptions.New, context: nil) 

및 클래스에이 기능 :

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    if keyPath == "bounds"  { 
     let rect = change!["new"] as! NSValue 

     if let playerRect: CGRect = rect.CGRectValue() as CGRect { 
      if playerRect.size == UIScreen.mainScreen().bounds.size { 
       print("Player in full screen") 
       isVideoInFullScreen = true 
      } else { 
       print("Player not in full screen") 
      } 
     } 
    } 
} 
+0

'new 대신'NSKeyValueChangeKey.newKey'를 사용하십시오 – gbk

+0

iOS 11에서 전혀 호출되지 않습니다 – karthikeyan

1

스위프트 2.2 만들고 AVPlayerViewController의 서브 클래스를 사용합니다.

class YouVideoPlayer: AVPlayerViewController { 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     if view.bounds == contentOverlayView?.bounds { 
      //code 
     } 
    } 
+3

설명서에서 : "Important AVPlayerViewController를 하위 클래스로 만들지 마십시오.이 클래스의 메서드를 재정의하면 지원되지 않으며 정의되지 않은 동작이 발생합니다." – Ilya

+0

@Ilya 내부 구조가 엉망이 아닌 한 서브 클래 싱하는 것이 좋습니다. – kambala

관련 문제