Это мой первый пост на SO. Я хотел бы поблагодарить всех пользователей SO, их вклад очень помог мне во всех моих проектах. Я новичок в сцене разработки приложений для iPhone.
Целью проекта является создание пользовательского интерактивного пользовательского интерфейса (UI) поверх объектов Movie Player (файлы * .mov на устройстве). Базовых полноэкранных MoviePlayers может быть несколько, и их нужно переключать на разные в зависимости от взаимодействия с пользователем.
Я использую cocos2D для создания пользовательского интерактивного пользовательского интерфейса и эффектов (например, эффекты частиц на жесте смахивания). И я использую Multiple MPMoviePlayerViewController
* для воспроизведения резидентных файлов фильмов (* .mov) в полноэкранном режиме (см. Пример MoviePlayer).
Требуется переключаться между фильмами, переключаясь между стандартным и альтернативным moviePlayer при обнаружении касания. Кроме того, переключение должно быть как можно более плавным.
Для достижения плавного переключения я использую два moviePlayerViewControllers
, каждое из которых является подпредставлением объекта UIView
в AppController.
Проблема а: я не уверен, что это правильный способ добиться переключения фильма.
Проблема б: В моем текущем решении. Значение по умолчанию MoviePlayer
поворачивается в портретном режиме, и иногда объект 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 - в основном он выделяет и вставляет два объекта moviePlayerViewController и добавляет их в качестве подвида к объектам Default и Alternate UIView из AppController
// 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];
}
}
Спасибо за вашу помощь. Дайте мне знать, если вам понадобится более подробная информация.