Почему iPhone 5 не поворачивается вверх
Я добавил новые методы в свой код, как описано в документах iOS 6 для iOS 6, но на iPhone 5 приложение не вращается вверх дном. Только для пейзажных Путей.
Здесь мой код от rootViewController:
- (NSUInteger)supportedInterfaceOrientations{
NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
}
- (BOOL)shouldAutorotate{
NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
return YES;
}
Я попробовал также "UIInterfaceOrientationMaskAll", но никаких изменений. "Странный", мой iPhone 4 с iOS6 делает его вверх дном с тем же кодом.
Любые идеи?
Ответы
Ответ 1
IOS 6 использует ориентацию по умолчанию UIInterfaceOrientationMaskAll
для iPad и UIInterfaceOrientationMaskAllButUpsideDown
для iPhone. Если вы хотите, чтобы ваши ViewControllers на iPhone вращались во всех направлениях, включая UpsideDown, вы должны добавить метод iOS 6:
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAll;
}
для всех контроллеров представления. Если вы это сделали, и он не работает, я делаю ставку на использование TabViewController или NavigationController, где некоторые из представлений НЕ возвращают это. Все ViewControllers должны вернуть это для ЛЮБОГО из них, чтобы поддержать его.
В качестве альтернативы вы можете добавить категорию в класс UITabViewController или NavigationController, который является вашим rootViewController и переопределяет этот метод. Вы делаете это так:
@interface UITabBarController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations;
@end
@implementation UITabBarController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
@end
Также это рекомендуемые в настоящее время подходы, обсуждаемые сейчас на форумах Apple Developer, с персоналом Apple, в котором говорилось, что предыдущая документация, которая обескураживает подкласс UINavigationController, устарела, и с iOS 6 это нормально.
Ответ 2
Благодаря Cliff Ribaudo действительно поможет полностью ответить на ваш проект UITabbarController, но в моем случае я использую только UINavigationController, поэтому я изменил ваш ответ для Categeory UINavigationController.
@interface UINavigationController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations;
@end
@implementation UINavigationController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
@end
Ответ 3
Простите многословие, но я думаю, что ваш ответ ниже.
У меня была такая же проблема, но это происходило на всех устройствах IOS 6, в том числе на моем iphone 4. Чтение вашего вопроса на самом деле ответило мне. Я удалил это много веков назад, потому что ничего не делал:
- (NSUInteger)supportedInterfaceOrientations{
NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown); }
и мой код отлично работал в предыдущих версиях ios. Похоже, что это стало мандатом в ios 6. Но только для upsideDown. Другие ориентации работали нормально.
Итак, спасибо.
Вернитесь к своей проблеме. Проанализировали ли вы цель своего проекта, чтобы убедиться, что все "Поддерживаемые интерфейсные ориентации" темно-серые? Мне интересно, если перевернутый свет светло-серый (т.е. Непроверенный). Я нашел в быстром тесте, что в предыдущих версиях ios они тоже игнорируются. Пока вы возвращаете YES из mustAutorotateToInterfaceOrientation, он будет поддерживать ориентацию, но не в iOS 6.
Наконец, вы внедрили shouldAutorotate, которого у меня нет в моем коде. Я думаю, что это по умолчанию да. И я думаю, что это просто говорит os, чтобы попытаться повернуть, но тогда вы должны сказать, какие ориентации вы поддерживаете с shouldAutorotateToInterfaceOrientation. Но ваш фрагмент не показывает, что вы внедрили shouldAutorotateToInterfaceOrientation. Я бы предложил реализовать это, поскольку он сообщает ОС, какие ориентации, которые вы поддерживаете, возвращаете простое ДА, означает, что вы поддерживаете все.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations.
//return (interfaceOrientation == UIInterfaceOrientationPortrait);
return YES;
}
Надеюсь, что это поможет.
Ответ 4
Целевые настройки по умолчанию не имеют направленной вверх ориентации, поэтому попробуйте следующее:
Перейти к файлу проекта
выберите целевое приложение
выберите вкладку "Summery"
убедитесь, что все типы ориентации нажаты
Удачи:)
Ответ 5
Если вы планируете включать или отключать вращение для всех контроллеров представления, вам не нужно подклассифицировать UINavigationController. Вместо этого используйте:
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
в AppDelegate.
Если вы планируете поддерживать все ориентации в своем приложении, но разные ориентации на контроллерах PARENT View (например, в стеке UINavigationController), вы должны использовать
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
из AppDelegate в сочетании со следующими способами в вашем контроллере просмотра PARENT.
- (BOOL)shouldAutorotate
и
- (NSUInteger)supportedInterfaceOrientations
Но если вы планируете иметь разные настройки ориентации в разных CHILDREN ViewControllers в том же стеке навигации (например, я), вам нужно проверить текущий ViewController в стеке навигации.
В моем подклассе UINavigationController я создал следующее:
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
int interfaceOrientation = 0;
if (self.viewControllers.count > 0)
{
id viewController;
DLog(@"%@", self.viewControllers);
for (viewController in self.viewControllers)
{
if ([viewController isKindOfClass:([InitialUseViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else if ([viewController isKindOfClass:([MainViewController class])])
{
interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
else
{
interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
}
}
}
return interfaceOrientation;
}
Поскольку вы больше не можете контролировать с помощью ViewControllers детей параметры поворота представленного контроллера представлений, вы должны каким-то образом перехватить какой контроллер просмотра в настоящее время находится в стеке навигации. Так вот что я сделал:). Надеюсь, что это поможет!