2011-05-24 7 views
3

標準コントロールと一緒にMPMoviePlayerControllerのビューにUIButtonを追加しようとしています。このボタンはビデオ上に表示され、予想される受信タッチイベントとして機能しますが、ユーザーの接触に応じて標準コントロールでフェードインまたはフェードアウトしたいと考えています。MPMoviePlayerControllerコントロールでフェード表示するUIButtonを追加する

私は自分のカスタムプレーヤーコントロールをローリングすることでこれを達成できると知っていますが、ボタンを1つ追加しようとしているので愚かなようです。

EDIT

あなたは再帰的にMPMoviePlayerControllerのビューのビュー階層を横断した場合、最終的にあなたがMPInlineVideoOverlayというビューのクラスに来ます。このビューに追加のコントロールを簡単に追加して、自動フェードイン/アウトの動作を実現できます。

いくつかの落とし穴ががありますが、それは時々あなたがMPMoviePlayerController作成した後に(私の経験では秒まで)時間がかかるし、それが完全に初期化される前のビューに追加して、それがMPInlineVideoOverlayだ作成することができます層。このため、私はこのコードが実行されるときに時々存在しないので、という名前のインスタンス変数をcontrolView以下のコードで作成しなければなりませんでした。これは、関数が0.1秒後に再び呼び出されるコードが見つからない場合に、最後のコードがある理由です。私は、この遅れにもかかわらず、私のインターフェイスに表示されるボタンの遅延を気付くことができませんでした。

-(void)setupAdditionalControls { 
    //Call after you have initialized your MPMoviePlayerController (probably viewDidLoad) 
    controlView = nil; 
    [self recursiveViewTraversal:movie.view counter:0]; 

    //check to see if we found it, if we didn't we need to do it again in 0.1 seconds 
    if(controlView) { 
      UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
      [controlView addSubview:backButton]; 
    } else { 
      [self performSelector:@selector(setupAdditionalControls) withObject:nil afterDelay:0.1]; 
    } 
} 


-(void)recursiveViewTraversal:(UIView*)view counter:(int)counter { 
    NSLog(@"Depth %d - %@", counter, view); //For debug 
    if([view isKindOfClass:NSClassFromString(@"MPInlineVideoOverlay")]) { 
      //Add any additional controls you want to have fade with the standard controls here 
      controlView = view; 
    } else { 
      for(UIView *child in [view subviews]) { 
        [self recursiveViewTraversal:child counter:counter+1]; 
      } 
    } 
} 

これは最適な解決策ではありませんが、他の誰かが同じことをしようとしている場合に投稿しています。 Appleがコントロールオーバーレイの内部のビュー構造またはクラス名を変更すると、それが壊れてしまいます。また、ビデオをフルスクリーンで再生していないと仮定しています(ただし、埋め込みコントロールでフルスクリーンで再生できます)。私もそれが押されたときにMPInlineVideoOverlayビューが削除され、リリースされるので、ここに記載されている技術を使用してフルスクリーンボタンを無効にする必要がありました:あなたは、上記のフルスクリーンの通知を受信したときiPad MPMoviePlayerController - Disable Fullscreen

setupAdditionalControlsを呼び出す再追加されますあなたのUIへの追加のコントロール。

誰かが私が思いついたこのハッカー以外の何かを提案できるなら、より洗練されたソリューションが大好きです。

+1

'MPInlineVideoOverlay'クラスを見つけるのではなく、 'MPFullScreenTransportControls'クラスを見つけようとしています。 –

答えて

5

た同じ問題に私のソリューション:

  • MPMoviePlayerControllerのビューの子としてボタンを追加します。
  • 適切な持続時間を持つalphaプロパティのアニメーションを使用してボタンをフェードインまたはフェードインします。
  • プレーヤーのコントローラーのtouchesBeganを処理し、そのボタンを使用して(アルファを使用して)ボタンの表示を切り替えます。
  • タイマーを使用して、ボタンを再び非表示にするタイミングを決定します。

    • フェード:0.1秒
    • フェードアウト:0.2秒
    • 試行錯誤することで

    、私は(現在)のiOSのものにマッチした期間があると判断し画面上の持続時間:5.0秒(ビューがタッチされるたびにそれを拡張する)

もちろんこれはまだ脆弱です。組み込みの遅延が変わると、私の見た目は間違っていますが、コードは引き続き実行されます。

+0

これはうまくいくはずですが、Appleがフェード持続時間を変更するのはビュー構造を変更するよりもはるかに少ないと思います。これと一緒に行くだろう。 –

+0

あなたはtouchedBeganをどのように扱うのですか?プレイヤーはUIVIewではないので、サブクラス化することはできません。また、向きが変わったときにボタンをどのように置き換えるのですか? –

+0

@JoãoNunesは代わりに 'MPMoviePlayerViewController'を使い、それをサブクラス化し、ムービーを再生するために' moviePlayer'プロパティを使います。オリエンテーションの変更に関しては、ボタンのCGRectを再計算する必要があります –

関連する問題