Вот поток, который я не могу понять, как работать. (когда я заявляю (работаю), это означает, что в этом текущем состоянии правила ориентации для этого представления работают правильно)
Первое представление: TableView в стеке UINavigationController, который является вкладкой UITabBarController.
TableView разрешено только в книжной ориентации. (за работой)
Когда вы поворачиваете TableView, чтобы создать модальный ландшафт, вы получаете пользовательский UIView, похожий на покровный поток (который я сейчас объясню здесь).
Выбор, сделанный для таблицы, помещает UIScrollview в стек.
UIScrollView допускается во всех ориентациях. (Работа)
Когда UIScrollView находится в ландшафтном режиме, и пользователь наносит ответный удар, он перенаправляется в пользовательский UIView, который похож на прикрытие и допускает только альбомную ориентацию.
Проблема здесь. Поскольку UIScrollView допускает полное вращение, он позволяет TableView вращаться также и в горизонтальной плоскости.
У меня есть метод, прикрепленный к уведомлению "UIDeviceOrientationDidChangeNotification", который проверяет, является ли пользовательское представление текущим контроллером, и если это так, и если пользователь повернулся обратно в портрет, мне нужно открыть пользовательское представление и показать таблицу вид.
Табличное представление должно повернуться назад к портрету, который действительно хорошо, пока пользователь не видит это. Когда я создаю пользовательскую анимацию, она работает довольно хорошо, за исключением какого-то странного невидимого черного ящика, который, кажется, вращается вместе с устройством прямо перед тем, как я исчезаю из пользовательского представления в виде таблицы.
Дальнейший порядок, чтобы гарантировать, что мое табличное представление повернется к портретному, я должен позволить настраиваемому представлению поддерживать все ориентации, потому что система смотрит на текущий вид (в моем коде) относительно того, разрешено ли этому приложению поворачиваться к определенная ориентация. Из-за этого многие предложенные решения покажут, что пользовательский вид поворачивается в портретную, когда табличное представление возвращается в фокус.
Моя другая проблема очень похожа. Если вы просматриваете таблицу и поворачиваете ее, отображается модальное представление пользовательского вида. Когда вы делаете выбор в этом представлении, он помещает UIScrollview в стек, но, поскольку Tableview поддерживает только портрет, UIScrollview входит в портрет, когда устройство находится в альбомном режиме.
Как мне преодолеть эти ужасные блоки?
Это моя текущая попытка:
Когда речь идет о работе с UITabBarController, система действительно заботится только о том, что tabbarcontroller говорит о вращении.
В настоящее время при загрузке представления оно сообщает о поддерживаемых ориентациях.
TabBarController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
switch (self.supportedOrientation) {
case SupportPortraitOrientation:
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
return (interfaceOrientation == UIInterfaceOrientationPortrait);
break;
case SupportPortraitUpsideDownOrientation:
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
return (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
break;
case SupportPortraitAllOrientation:
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
break;
case SupportLandscapeLeftOrientation:
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
break;
case SupportLandscapeRightOrienation:
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
break;
case SupportLandscapeAllOrientation:
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
break;
case SupportAllOrientation:
if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
}else {
//[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
}
return YES;
break;
default:
return (interfaceOrientation == UIInterfaceOrientationPortrait);
break;
}
}
Этот блок кода является частью моего UINavigationController и находится в методе, который отвечает на уведомление UIDeviceOrientationDidChangeNotification. Он отвечает за отображение пользовательского представления и отображение таблицы. Существуют две разные версии, которые изначально предназначались для двух разных версий SDK, но обе довольно близки к решениям.
Причина, по которой первая версия не поддерживается в версии 3.0, заключается в том, что по какой-то причине у вас не может быть представления, которое отображается, а затем отображается как модальное представление. Не уверен, что это ошибка или особенность.
Второе решение работает довольно хорошо, за исключением того, что я вижу внешнюю коробку, вращающуюся вокруг iphone.
if ([[self topViewController] isKindOfClass:FlowViewController.class]) {
NSString *iphoneVersion = [[UIDevice currentDevice] systemVersion];
double version = [iphoneVersion doubleValue];
if(version > 3.0){ //1st solution
//if the delivered app is not built with the 3.1 SDK I don't think this will happen anyway
//we need to test this
[self presentModalViewController:self.flowViewController animated:NO];
//[self toInterfaceOrientation:UIDeviceOrientationPortrait animated:NO];
[self popViewControllerAnimated:NO];
[self setNavigationBarHidden:NO animated:NO];
[self dismissModalViewControllerAnimated:YES];
}else{ //2nd solution
DLog(@"3.0!!");
//[self toInterfaceOrientation:UIDeviceOrientationPortrait animated:NO];
CATransition *transition = [CATransition animation];
transition.duration = 0.50;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFade;
CATransition *tabBarControllerLayer = [CATransition animation];
tabBarControllerLayer.duration = 0.50;
tabBarControllerLayer.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
tabBarControllerLayer.type = kCATransitionPush;
tabBarControllerLayer.subtype = kCATransitionFade;
[self.tabBarController.view.layer addAnimation:transition forKey:kCATransition];
[self.view.layer addAnimation:transition forKey:kCATransition];
[self popViewControllerAnimated:NO];
[self setNavigationBarHidden:NO animated:NO];
}
[self performSelector:@selector(resetFlow) withObject:nil afterDelay:0.75];
}
Я почти уверен, что нет решения, кроме ручного вращения, которое портит вращение клавиатуры.
Любой совет будет оценен!
Спасибо.