SOでの初投稿です。すべての SO ユーザーに感謝したいと思います。彼らの貢献は、すべてのプロジェクトで私を大いに助けてくれました。私はiPhoneアプリケーション開発シーンに不慣れです。
このプロジェクトの目的は、ムービー プレーヤー オブジェクト (デバイス上の *.mov ファイル) の上にカスタムのインタラクティブなユーザー インターフェイス (UI) を持つことです。基礎となる FullScreen MoviePlayers は複数になる可能性があり、ユーザーの操作に基づいて別のものに切り替える必要があります。
私は cocos2D を使用して、カスタムのインタラクティブな UI とエフェクト (スワイプ ジェスチャのパーティクル エフェクトなど) を実現しています。また、Multiple MPMoviePlayerViewController
* を使用して常駐ムービー ファイル (*.mov) をフルスクリーン モードで再生しています (MoviePlayer サンプルを参照)。
要件は、タッチ検出時にデフォルトの moviePlayer と代替の moviePlayer を切り替えることで、ムービーを切り替えることです。また、切り替えはできるだけスムーズにする必要があります。
スムーズな切り替えを実現するために、それぞれAppController のオブジェクトmoviePlayerViewControllers
のサブビューである2 つの を使用しています。UIView
問題 a: これがムービーの切り替えを実現する正しい方法かどうかわかりません。
問題b:私の現在の解決策では。DefaultMoviePlayer
は縦向きモードで回転し、moviePlayer オブジェクトが表示されないことがあります。動作に一貫性がありません。
問題 c: 代替ムービー プレーヤー ( MPMoviePlayerViewController
UIWindow のサブビューとして最初に追加されたオブジェクト) はデバイスの回転時に回転し、既定のムービー プレーヤー (MPMoviePlayerViewController
後に追加されたオブジェクト) は正しく動作しません。論理的な説明が思いつきません。MPMoviePlayerViewController
独自のウィンドウを作成することを読んだどこかで、それが問題になる可能性があります。
// From AppController.h
UIWindow *window; // Parent application window
UIView *viewCocos2D; // Cocos View
UIView *viewMovie; // Default MoviePlayer View
UIView *viewMovieAlternate; // Alternate MoviePlayer View
// From AppController.m
// From DidAppFinishLoading
{
...
// Init the window
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Init the views (Cocos2d, MOviePlayer and AlternateMOviePlayer)
viewCocos2D = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
viewMovie = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
viewMovieAlternate = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// cocos2d will inherit these values
[viewCocos2D setUserInteractionEnabled:YES];
[viewCocos2D setMultipleTouchEnabled:YES];
// create OpenGL view and attach it to a window
//[[[UIApplication sharedApplication] keyWindow] addSubview:window];
[[CCDirector sharedDirector] attachInView:viewCocos2D];
// Default texture format for PNG/BMP/TIFF/JPEG/GIF images
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
// Create a
customMoviePlayerWithUI = [[CustomMoviePlayerWithUI alloc] initWithSuperView:window andMovieView:viewMovie andAlternateView:viewMovieAlternate andSelf:self];
CCScene *scene = [CCScene node];
CocosCustomLayer *cocosLayer = [customMoviePlayerWithUI cocosLayer];
[window addSubview:viewMovieAlternate];
[window addSubview:viewMovie];
// somehow this order lets cocos2D receive the touch events
[window addSubview:viewCocos2D];
[scene addChild: cocosLayer];
[window makeKeyAndVisible];
[[CCDirector sharedDirector] runWithScene: scene];
[UIAccelerometer sharedAccelerometer].delegate = self;
[customMoviePlayerWithUI start];
[self didRotate:nil];
...
}
したがって、ビュー階層は
別のムービー プレーヤー ビューが一番下にあります。デフォルトのムービー プレーヤー ビューが次にあります。Cocos2D レイヤー ビューが一番上にあります。Cocos2D ビューもすべてのイベントを受け取ります。
// From CustomMoviePlayerWithUI.h
MPMoviePlayerViewController *moviePlayerView;
MPMoviePlayerViewController *moviePlayerViewAlternate;
// These delegates are used frequently to invoke some functions
AppController* delegateApplication;
UIView *delegateSuperWindow; // Window which contains everything -
UIView *delegateView; // View containing default MoviePlayer
UIView *delegateViewAlternate;// View containing alternate MoviePlayer
以下は、moviePlayerViewController の初期化コードです。基本的には、2 つの moviePlayerViewController オブジェクトを割り当てて初期化し、それらを AppController の Default および Alternate UIView オブジェクトにサブビューとして追加します。
// From customMoviePlayer.m
// initAndPlayMovie is called from the init of CustomMoviePlayer
- (void)initAndPlayMovie:(UIView *)view andAlternateView:(UIView*) viewMovieAlternate
{
// Initialize a movie player object with the specified URL
moviePlayerView = [[MPMoviePlayerViewController alloc] init];
moviePlayerViewAlternate = [[MPMoviePlayerViewController alloc] init];
[moviePlayerView shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];
[moviePlayerViewAlternate shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];
//if (moviePlayer)
if (moviePlayerView && moviePlayerViewAlternate)
{
[[[moviePlayerView moviePlayer] backgroundView] setBackgroundColor:[UIColor blueColor]];
[[[moviePlayerViewAlternate moviePlayer] backgroundView] setBackgroundColor:[UIColor redColor]];
//[moviePlayerView setWantsFullScreenLayout:YES];
// private API call.. don't use it..
//[mp setOrientation:UIDeviceOrientationPortrait animated:NO];
[view addSubview:[moviePlayerView view]];
[viewMovieAlternate addSubview:[moviePlayerViewAlternate view]];
//[view bringSubviewToFront:[moviePlayerView view]];
//[[moviePlayerView moviePlayer] play];
}
}
ご協力いただきありがとうございます。詳細が必要な場合はお知らせください。