2011-05-24 2 views
3

J'essaye d'ajouter un UIButton à la vue d'un MPMoviePlayerController avec les contrôles standard. Le bouton apparaît au-dessus de la vidéo et fonctionne comme prévu lors de la réception des événements tactiles, mais je voudrais qu'il se fondre dans et hors des contrôles standard en réponse aux touches de l'utilisateur.MPMoviePlayerController ajoutant UIButton pour voir que fade avec des contrôles

Je sais que je pourrais accomplir ceci en roulant mes propres commandes de joueur faites sur commande, mais il semble stupide puisque j'essaye juste d'ajouter un bouton.

EDIT

Si vous traversez récursive la hiérarchie de vue de vue de l » MPMoviePlayerController finalement vous arriverez à une classe de vue appelée MPInlineVideoOverlay. Vous pouvez facilement ajouter des contrôles supplémentaires à cette vue pour obtenir le comportement de fondu entrant/sortant automatique.

Il y a quelques trucs bien, il peut parfois prendre un certain temps (jusqu'à une seconde dans mon expérience) après avoir créé le MPMoviePlayerController et ajouté à une vue avant qu'il ait initialisé pleinement et créé c'est MPInlineVideoOverlay couche. Pour cette raison, j'ai dû créer une variable d'instance appelée controlView dans le code ci-dessous car parfois il n'existe pas lorsque ce code s'exécute. C'est pourquoi j'ai le dernier bit de code où la fonction s'appelle à nouveau en 0.1 secondes si elle n'est pas trouvée. Je n'ai pas remarqué de retard dans le bouton apparaissant sur mon interface malgré ce retard. Ce n'est pas la meilleure solution, mais je la poste au cas où quelqu'un d'autre essaie de faire la même chose. Si Apple modifiait la structure de la vue ou les noms de classe internes à la superposition de contrôle, elle se briserait. Je suppose également que vous ne lisez pas la vidéo en plein écran (bien que vous puissiez la lire en plein écran avec des contrôles intégrés). J'ai aussi dû désactiver le bouton plein écran en utilisant la technique décrite ici parce que le MPInlineVideoOverlay vue se retire et libéré quand il est pressé: iPad MPMoviePlayerController - Disable Fullscreen

Appel setupAdditionalControls lorsque vous recevez les notifications fullscreen décrites ci-dessus rajoutez votre contrôles supplémentaires à l'interface utilisateur.

J'aimerais une solution plus élégante si quelqu'un peut suggérer quelque chose d'autre que ce hackery que j'ai imaginé.

+1

Pour l'iPhone 5, au lieu de trouver une classe 'MPInlineVideoOverlay' essayez de trouver la classe 'MPFullScreenTransportControls' –

Répondre

5

Ma solution au même problème était:

  • Ajouter le bouton comme un enfant de vue de l » MPMoviePlayerController;
  • fondu le bouton dans et en utilisant l'animation de sa propriété alpha, avec les durées appropriées;
  • gérer le touchesBegan du contrôleur du lecteur, et l'utiliser pour basculer la visibilité du bouton (en utilisant son alpha);
  • Utilisez une minuterie pour déterminer quand masquer à nouveau le bouton.

par essais et erreurs, je résolus que les durées qui correspondent à ceux (actuels) iOS sont:

  • fade in: 0,1s
  • fondu: 0,2s
  • durée à l'écran: 5.0s (étendre que chaque fois que la vue est touchée)

Bien sûr, cela reste fragile; Si les retards intégrés changent, le mien semblera faux, mais le code fonctionnera toujours.

+0

Merci, cela devrait fonctionner, je pense qu'Apple changeant les durées de fondu serait beaucoup moins probable que de changer la structure de la vue. Va aller avec ça. –

+0

pouvez-vous donner un exemple comment manipulez-vous le touchedBegan? le joueur n'est pas un UIVIew donc il n'est pas possible de le sous-classer. Aussi comment remplacez-vous le bouton quand l'orientation change? –

+0

@ JoãoNunes utilise un 'MPMoviePlayerViewController' à la place et le sous-classe et utilise sa propriété' moviePlayer' pour lire le film. En ce qui concerne les changements d'orientation, vous devez recalculer le 'CGRect' pour le bouton –

Questions connexes