gpt4 book ai didi

ios - 检测 AVPlayerViewController 完成按钮点击?

转载 作者:可可西里 更新时间:2023-11-01 04:55:51 25 4
gpt4 key购买 nike

我正在为 ios 中的 AVPlayer 编写插件。我需要知道用户何时单击 AVPlayerViewController 中的Done 按钮(我想知道用户何时关闭视频)并且我无法访问 AVPlayerViewController 对象。我检查了事件,发现 AVPlayer 中只有速率属性设置为 0 但在暂停情况下,速率也设置为 0 。我如何弄清楚这两种情况?谢谢大家。

最佳答案

我在窗口模式下开发播放器时遇到了这个问题。是currently impossible没有技巧。因此,我使用 KVO 来观察 contentOverlayView,它实际上是 AVPlayerViewController 的全尺寸 View 。代码有点复杂。在下面的示例中,playerView 属性是来自 View Controller 上的 xib/storyboard 的 View (见附件)。

#import <AVKit/AVKit.h>
#import <AVFoundation/AVFoundation.h>

static NSString * const kBoundsProperty = @"bounds";
static void * kBoundsContext = &kBoundsContext;

@interface ViewController ()

@property (nonatomic, strong) AVPlayerViewController *playerViewController;
// View for windowed mode.
@property (weak, nonatomic) IBOutlet UIView *playerView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

self.playerViewController = [[AVPlayerViewController alloc] init];
}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

// Because in -viewDidLoad frame is unknown.
[self loadPlayerView];
}

- (void)loadPlayerView {
NSURL *videoURL = [NSURL URLWithString:@"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
AVPlayer *player = [[AVPlayer alloc] initWithURL:videoURL];
self.playerViewController.player = player;

[player play];

[self addChildViewController:self.playerViewController];
[self.playerView addSubview:self.playerViewController.view];

// MARK: I would recommend to use constraints instead of frame.
self.playerViewController.view.frame = self.playerView.bounds;

[self.playerViewController.contentOverlayView addObserver:self forKeyPath:kBoundsProperty options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:kBoundsContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if (context == kBoundsContext) {
CGRect oldBounds = [change[NSKeyValueChangeOldKey] CGRectValue];
CGRect newBounds = [change[NSKeyValueChangeNewKey] CGRectValue];

BOOL wasFullscreen = CGRectEqualToRect(oldBounds, [UIScreen mainScreen].bounds);
BOOL isFullscreen = CGRectEqualToRect(newBounds, [UIScreen mainScreen].bounds);
if (isFullscreen && !wasFullscreen) {
if (CGRectEqualToRect(oldBounds, CGRectMake(0.0, 0.0, newBounds.size.height, newBounds.size.width))) {
NSLog(@"Rotated fullscreen");
} else {
NSLog(@"Entered fullscreen");
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"DidEnterInFullscreen" object:nil];
});
}
} else if (!isFullscreen && wasFullscreen) {
NSLog(@"Exited fullscreen");
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"DidExitFromFullscreen" object:nil];
});
}
}
}

@end

关于ios - 检测 AVPlayerViewController 完成按钮点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com