обнаружить AVPlayerViewController Нажмите кнопку «Готово»?

Пишу плагин для AVPlayer в ios. Мне нужно знать, когда пользователь нажимает кнопку Готово в AVPlayerViewController (я хочу знать, когда пользователь закрывает видео), и у меня нет доступа к объекту AVPlayerViewController. Я проверил событие и обнаружил, что только свойство скорости в AVPlayer установлено на 0, но в ситуации паузы также установлено значение скорости на 0. как мне понять эти две ситуации? Спасибо всем.


person vahid    schedule 08.10.2016    source источник
comment
решение работает для меня.   -  person Jerome    schedule 17.02.2017
comment
Возможный дубликат события нажатия кнопки "Готово" в AVPlayerViewController   -  person Jonathan Cabrera    schedule 17.10.2018


Ответы (1)


Я столкнулся с проблемой, когда разрабатывал плеер в оконном режиме. Без хитростей это в настоящее время невозможно. Поэтому я использовал KVO для наблюдения за contentOverlayView, который на самом деле является полноразмерным изображением AVPlayerViewController. Код немного сложный. В приведенном ниже примере свойство playerView представляет собой представление из xib/storyboard на контроллере представления (см. вложение).

#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

person Oleg    schedule 12.10.2016