Итак, у меня есть эта проблема с приложением, которое я создаю, я не могу понять. Мое приложение имеет следующую структуру:
UITabBarController → UIViewController → UIViewController
Последний контроллер представления содержит UIWebView, который загружает всю страницу. На этой странице есть фильм (mp4), который пользователи могут играть, когда они нажимают кнопку большого раунда.
Приложение выполнено таким образом, что оно выполняется в портретном режиме, и я не могу сделать это в противном случае из-за его первоначального дизайна.
То, что я хочу достичь, это позволить пользователям поворачивать свои телефоны после начала воспроизведения фильма и соответственно поворота фильма. Мне удалось "обнаружить", когда фильм воспроизводится, прослушивая разные NSNotifications, которые отправляет NSNotificationsCenter.
Я использовал это для обнаружения начала:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieIsPlaying:)
name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
object:nil];
и это для обнаружения конца:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieStopedPlaying:)
name:@"UIMoviePlayerControllerDidExitFullscreenNotification"
object:nil];
С двумя селекторами теперь я устанавливаю одну глобальную переменную в YES или NO, которую я могу использовать позже в
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
Если я всегда возвращаю YES из приведенного выше метода, мой прикладной интерфейс вращается навсегда, за исключением случаев, когда фильм работает и работает. Самое странное:
- Я открываю приложение в портрете.
- Перейдите на нужную страницу (см. мою структуру выше)
- Поворот телефона в альбомный (интерфейс вращается - это только для отладки)
- Я запускаю фильм (он запускается в ландшафте! Horray!)
- Я поворачиваю телефон назад к портрету (фильм вращается! Horray снова!)
- Я поворачиваю телефон обратно в альбом (больше не происходит поворот...)
Также, если я запускаю фильм в портретном режиме, он никогда не будет вращаться.
Итак, пожалуйста, ребята, дайте мне знать, если вы можете мне как-то помочь. Я действительно в отчаянии. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Спасибо!
Обновление
В конце концов я придумал это решение для двух упомянутых выше методов:
- (void)movieIsPlaying:(NSNotification *)notification
{
if (![Globals canRotateInterface]) {
[Globals setCanRotateInterface:YES];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
[[[[notification object] view] window] setBounds:CGRectMake(0, 0, 480, 320)];
[[[[notification object] view] window] setCenter:CGPointMake(160, 240)];
[[[[notification object] view] window] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
}
}
- (void)movieStopedPlaying:(NSNotification *)notification
{
if ([Globals canRotateInterface]) {
[Globals setCanRotateInterface:NO];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO];
[[[[notification object] view] window] setBounds:CGRectMake(0, 0, 320, 480)];
[[[[notification object] view] window] setTransform:CGAffineTransformIdentity];
// Little hack to force an orientation rotation so that all elements get their original size and place (eg. Navigation bar)
UINavigationController *dummyNavigationViewController = [[UINavigationController alloc] init];
[self presentModalViewController:dummyNavigationViewController animated:NO];
[self dismissModalViewControllerAnimated:NO];
[dummyNavigationViewController release];
}
}