【发布时间】:2014-10-12 21:41:42
【问题描述】:
如何检测用户何时按下 AVPlayerViewController 的展开图标? 我想知道电影播放什么时候进入全屏模式。
【问题讨论】:
-
你有这方面的 Swift 代码吗?
标签: ios8 avfoundation
如何检测用户何时按下 AVPlayerViewController 的展开图标? 我想知道电影播放什么时候进入全屏模式。
【问题讨论】:
标签: ios8 avfoundation
也可以观察playerViewController.contentOverlayView 中的bounds 并将其与[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");
}
}
}
}
【讨论】:
您可以使用 KVO 观察您的 AVPlayerViewController 实例的 videoBounds 属性。
编辑 最基本的例子是
[_myPlayerViewController addObserver:self forKeyPath:@"videoBounds" options:0 context:nil];
【讨论】:
playerViewController.player 的status 属性——你需要观察playerViewController 的videoBounds 属性
将此观察者添加到初始化函数中,例如 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")
}
}
}
}
【讨论】:
NSKeyValueChangeKey.newKey 而不是new
斯威夫特 2.2 创建和使用 AVPlayerViewController 的子类。
class YouVideoPlayer: AVPlayerViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if view.bounds == contentOverlayView?.bounds {
//code
}
}
【讨论】:
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;
}
}
}
【讨论】: