AVPlayerViewController

AVPlayerViewController

我在ios中为AVPlayer编写插件。我需要知道用户何时单击AVPlayerViewController中的完成的按钮(我想知道用户何时关闭视频),并且无法访问AVPlayerViewController对象。我检查了事件,仅在AVPlayer中将rate属性设置为0,但在暂停情况下也将rate设置为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完成按钮单击吗?-LMLPHP

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

10-12 03:52