2016-10-08 3 views
6

iosでAVPlayerのプラグインを作成しています。ユーザーがいつクリックするかを知る必要があるボタンをAVPlayerViewController(ユーザーがいつ閉じるか知りたい)とし、AVPlayerViewControllerオブジェクトにアクセスしません。私はイベントをチェックし、AVPlayerのレートプロパティのみが0に設定されていることを確認しましたが、ポーズの状況でもレートは0に設定されていました。私はこれら二つの状況をどのように把握していますか?ありがとうございます。 AVPlayerViewControllerを検出しますか?

+0

[ソリューション](http://stackoverflow.com/a/41281453/4593553は)私のために働きます。 – Jerome

答えて

0

ウィンドウモードでプレイヤーを開発していたときに問題が発生しました。トリックなしでcurrently impossibleです。したがって、実際にはAVPlayerViewControllerのフルサイズのビューであるcontentOverlayViewを観察するためにKVOを使用しました。コードは少し複雑です。以下の例では、playerViewプロパティは、View Controller(添付資料を参照)の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 

関連する問題