Пишу плагин для AVPlayer
в ios. Мне нужно знать, когда пользователь нажимает кнопку Готово в AVPlayerViewController
(я хочу знать, когда пользователь закрывает видео), и у меня нет доступа к объекту AVPlayerViewController
. Я проверил событие и обнаружил, что только свойство скорости в AVPlayer
установлено на 0, но в ситуации паузы также установлено значение скорости на 0. как мне понять эти две ситуации? Спасибо всем.
обнаружить AVPlayerViewController Нажмите кнопку «Готово»?
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