Bouton personnalisé dans AVPlayerViewController.ContentOverlayView

J'ai besoin d'append un button personnalisé à l'AVPlayerViewController qui apparaîtra à la fois en plein écran et en plein écran pour une application exécutant iOS 8.

L'ajout d'un button à AVPlayerViewController.view ou à la vue contenant ne fonctionnera pas en mode plein écran mais lorsque le lecteur passe en mode plein écran, le button n'est plus visible. J'ai trouvé que si j'ajoute un button à l'AVPlayerViewController.ContentOverlayView alors il apparaît en plein écran et non plein écran, mais alors il ne semble pas que le ContentOverlayView répond à toutes les touches de sorte que le button ne peut pas être cliqué. Est-ce que quelqu'un sait d'un endroit différent pour append le button ou un moyen de rendre le ContentOverlayView répondre aux touches?

Exemple de code

AVPlayerViewController *playerView = [[AVPlayerViewController alloc] init]; playerView.player = [AVPlayer playerWithURL:movieURL]; CGRect viewInsetRect = CGRectInset ([self.view bounds], kMovieViewOffsetX, kMovieViewOffsetY ); /* Inset the movie frame in the parent view frame. */ [[playerView view] setFrame:viewInsetRect]; [self.view addSubview: [playerView view]]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.backgroundColor = [UIColor yellowColor]; btn.frame = CGRectMake(50, 50, 200, 75); [btn addTarget:self action:@selector(didSelectButton:) forControlEvents:UIControlEventTouchUpInside]; [btn setUserInteractionEnabled:YES]; [btn setEnabled:YES]; [playerView.contentOverlayView addSubview:btn]; 

J'ai réussi à get ce travail en ajoutant ce qui suit à mon AVPlayerViewController dans IB:

  1. Une vue de superposition avec un button à l'intérieur
  2. Ajouter des contraintes pour centrer le button dans la vue de superposition
  3. Création d'un IBOutlet à la vue (je l'ai appelé "overlay")
  4. Créé une action du button à AVPlayerViewController qui imprime quelque chose afin que nous puissions voir que le fait de cliquer sur le button fonctionne
  5. Glissé la vue de superposition hors de la hiérarchie de vue et sur la barre supérieure du controller de vue (apparaît comme une icône de vue dans la barre supérieure du controller de vue avec l'icône de sortie, etc.)

puis dans le code de AVPlayerViewController:

  override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(self.overlay) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() self.overlay.frame = self.view.bounds } @IBAction func playBtnTapped(sender: AnyObject) { println("PlayBtnTapped") } 

Le button est maintenant centré en mode plein écran / normal et le button fonctionne

J'ai eu la même situation juste maintenant.

Au lieu de:

 [playerView.contentOverlayView addSubview:btn]; 

utiliser (après avoir ajouté le playerView)

 [self.view addSubview:btn]; 

Cela appenda le button dans le lecteur minimisé.

Maintenant, pour le plein écran, je n'ai trouvé aucune autre méthode fiable pour vérifier si le joueur est passé en plein écran ou en arrière, alors voici une solution:

 self.windowChecker = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkIfFullscreen) userInfo:nil repeats:YES]; 

et ça:

 -(void)checkIfFullscreen{ NSLog(@"videoBounds\n %f %f ", self.avVideoPlayer.contentOverlayView.frame.size.width,self.avVideoPlayer.contentOverlayView.frame.size.height); if ([self playerIsFullscreen]) { // check the frame on this for(UIWindow* tempWindow in [[UIApplication sharedApplication]windows]){ for(UIView* tempView in [tempWindow subviews]){ if ([[tempView description] rangeOfSsortingng:@"UIInputSetContainerView"].location != NSNotFound){ UIButton *testB = [[UIButton alloc] initWithFrame: CGRectMake(20, 20, 400, 400)]; testB.backgroundColor = [UIColor redColor]; [testB addTarget:self action:@selector(buttonTouch) forControlEvents:UIControlEventTouchDown]; [tempView addSubview:testB]; break; } } } } } 

Je sais que ce n'est pas un bon moyen de le faire, mais c'est la seule façon que j'ai réussi à append une interface user personnalisée qui reçoit également des events tactiles sur le lecteur.

À votre santé!