Поскольку ShouldAutorotateToInterfaceOrientation
в iOS 6 эта функция устарела, и я использовал ее для принудительного отображения только портретной ориентации в конкретном представлении , как правильно это сделать в iOS 6? Это только для одной области моего приложения, все остальные представления могут вращаться.
ios
xcode
ios6
xamarin.ios
Нил
источник
источник
Лучший способ специально для iOS6 отмечен в «iOS6 By Tutorials» команды Рэя Вендерлиха - http://www.raywenderlich.com/ и
UINavigationController
в большинстве случаев лучше, чем создание подклассов .Я использую iOS6 с раскадровкой, которая включает
UINavigationController
набор в качестве начального контроллера представления.//AppDelegate.m - этот метод, к сожалению, недоступен до iOS6
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; if(self.window.rootViewController){ UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; orientations = [presentedViewController supportedInterfaceOrientations]; } return orientations; }
//MyViewController.m - вернуть любые ориентации, которые вы хотите поддерживать для каждого
UIViewController
- (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; }
источник
Этот ответ относится к вопросам, заданным в комментариях к сообщению OP:
Чтобы заставить представление отображаться в заданной ориентации, поместите в viewWillAppear следующее:
UIApplication* application = [UIApplication sharedApplication]; if (application.statusBarOrientation != UIInterfaceOrientationPortrait) { UIViewController *c = [[UIViewController alloc]init]; [self presentModalViewController:c animated:NO]; [self dismissModalViewControllerAnimated:NO]; }
Это немного похоже на взлом, но это заставляет
UIViewController
отображать изображение в портретной ориентации, даже если предыдущий контроллер был альбомным.ОБНОВЛЕНИЕ для iOS7
Вышеуказанные методы теперь устарели, поэтому для iOS 7 используйте следующее:
UIApplication* application = [UIApplication sharedApplication]; if (application.statusBarOrientation != UIInterfaceOrientationPortrait) { UIViewController *c = [[UIViewController alloc]init]; [c.view setBackgroundColor:[UIColor redColor]]; [self.navigationController presentViewController:c animated:NO completion:^{ [self.navigationController dismissViewControllerAnimated:YES completion:^{ }]; }]; }
Интересно, что на момент написания либо подарок, либо увольнение должны быть анимированы. В противном случае вы получите белый экран. Понятия не имею, почему это заставляет его работать, но это действительно так! Визуальный эффект различается в зависимости от анимации.
источник
Поэтому я столкнулся с той же проблемой при отображении модальных представлений только в портретной ориентации. Обычно я бы создал
UINavigationController
, установилviewController
какrootViewController
, а затем отобразилUINavigationController
как модальное представление. Но с iOS 6viewController
теперь будет запрашивать у navigationController поддерживаемую ориентацию интерфейса (которая по умолчанию теперь предназначена только для iPad и всего, кроме перевернутого для iPhone).Решение : мне пришлось создать подкласс
UINavigationController
и переопределить методы авторотации. Вид хромой.- (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } // pre-iOS 6 support - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (toInterfaceOrientation == UIInterfaceOrientationPortrait); }
источник
IOS 5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ return (interfaceOrientation == UIInterfaceOrientationPortrait); }
IOS 6
-(BOOL)shouldAutorotate{ return YES; } -(NSInteger)supportedInterfaceOrientations{ // UIInterfaceOrientationMaskLandscape; // 24 // // UIInterfaceOrientationMaskLandscapeLeft; // 16 // // UIInterfaceOrientationMaskLandscapeRight; // 8 // // UIInterfaceOrientationMaskPortrait; // 2 // return UIInterfaceOrientationMaskPortrait; // or return 2; }
источник
Я не согласен с ответом @aprato, потому что методы вращения UIViewController объявлены в самих категориях, что приводит к неопределенному поведению, если вы переопределяете его в другой категории. Безопаснее переопределить их в подклассе UINavigationController (или UITabBarController).
Кроме того, это не распространяется на сценарий, в котором вы нажимаете / представляете / выталкиваете из альбомной ориентации в вертикальную вертикальную ориентацию или наоборот. Чтобы решить эту сложную проблему (никогда не решавшуюся Apple), вам следует:
В iOS <= 4 и iOS> = 6:
UIViewController *vc = [[UIViewController alloc]init]; [self presentModalViewController:vc animated:NO]; [self dismissModalViewControllerAnimated:NO]; [vc release];
В iOS 5:
UIWindow *window = [[UIApplication sharedApplication] keyWindow]; UIView *view = [window.subviews objectAtIndex:0]; [view removeFromSuperview]; [window addSubview:view];
Это ДЕЙСТВИТЕЛЬНО заставит UIKit переоценить все ваши shouldAutorotate, supportedInterfaceOrientations и т. Д.
источник
У меня очень хороший подход к смешиванию https://stackoverflow.com/a/13982508/2516436 и https://stackoverflow.com/a/17578272/2516436
-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; if(self.window.rootViewController){ UIViewController *presentedViewController = [self topViewControllerWithRootViewController:self.window.rootViewController]; orientations = [presentedViewController supportedInterfaceOrientations]; } return orientations; } - (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController { if ([rootViewController isKindOfClass:[UITabBarController class]]) { UITabBarController* tabBarController = (UITabBarController*)rootViewController; return [self topViewControllerWithRootViewController:tabBarController.selectedViewController]; } else if ([rootViewController isKindOfClass:[UINavigationController class]]) { UINavigationController* navigationController = (UINavigationController*)rootViewController; return [self topViewControllerWithRootViewController:navigationController.visibleViewController]; } else if (rootViewController.presentedViewController) { UIViewController* presentedViewController = rootViewController.presentedViewController; return [self topViewControllerWithRootViewController:presentedViewController]; } else { return rootViewController; } }
и вернуть те ориентации, которые вы хотите поддерживать для каждого UIViewController
- (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; }
источник
У меня есть относительно сложное универсальное приложение, использующее UISplitViewController и UISegmentedController, и несколько представлений, которые должны быть представлены в ландшафте с использованием
presentViewController
. Используя методы, предложенные выше, я смог заставить iPhone ios 5 и 6 работать нормально, но по какой-то причине iPad просто отказался отображаться как альбомный. Наконец, я нашел простое решение (реализованное после нескольких часов чтения, проб и ошибок), которое работает как для устройств, так и для iOS 5 и 6.Шаг 1) На контроллере укажите требуемую ориентацию (примерно как указано выше)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationLandscapeRight); } -(BOOL)shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { NSInteger mask = UIInterfaceOrientationMaskLandscape; return mask; }
Шаг 2) Создайте простой подкласс UINavigationController и реализуйте следующие методы.
-(BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; }
Шаг 3) Представьте свой viewController
vc = [[MyViewController alloc]init]; MyLandscapeNavigationController *myNavigationController = [[MyLandscapeNavigationController alloc] initWithRootViewController:vc]; [self myNavigationController animated:YES completion:nil];
Надеюсь, это кому-то поможет.
источник
Чтобы не было скучно, но не могли бы вы поделиться своим подклассом? Спасибо.
edit: ну, наконец, я сделал это, подкласс было очень просто сделать. Я просто должен был объявить
navigationController
вAppDelegate
качествеUINavigationControllerSubclass
вместо значения по умолчаниюUINavigationController
, то редактировал подкласс с:- (BOOL)shouldAutorotate { return _shouldRotate; }
поэтому я могу установить любое представление, которое хочу повернуть или нет, позвонив по адресу
viewDidLoad
_navController = (UINavigationController *)self.navigationController; [_navController setShouldRotate : YES / NO]
Надеюсь, эта настройка поможет и другим, спасибо за совет!
Совет: используйте
- (NSUInteger)supportedInterfaceOrientations
в ваших контроллерах просмотра, поэтому вы не получите желаемый портретный вид в альбомной или наоборот.
источник
Я сам не тестировал, но в документации указано, что теперь вы можете переопределить эти методы:
supportedInterfaceOrientations
иpreferredInterfaceOrientationForPresentation
.Вероятно, вы сможете добиться того, чего хотите, установив только ту ориентацию, которая вам нужна этими методами.
источник
Ответы с использованием подклассов или категорий, позволяющих использовать VC в классах UINavigationController и UITabBarController, работают хорошо. Не удалось запустить модальное окно с портретной ориентацией из контроллера панели вкладок с альбомной ориентацией. Если вам нужно это сделать, воспользуйтесь уловкой отображения и скрытия неанимированного модального представления, но сделайте это в методе viewDidAppear . У меня это не сработало в viewDidLoad или viewWillAppear.
Кроме того, приведенные выше решения работают нормально.
источник
Для Monotouch это можно сделать так:
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() { return UIInterfaceOrientationMask.LandscapeRight; } public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation() { return UIInterfaceOrientation.LandscapeRight; }
источник
Я вижу много ответов, но не понимаю конкретной идеи и ответа об ориентации, но вижу, что ссылка хорошо понимает ориентацию и удаляет принудительное вращение для ios6.
http://www.disalvotech.com/blog/app-development/iphone/ios-6-rotation-solution/
Я думаю, это полная помощь.
источник
Просто перейдите в project.plist, затем добавьте Поддерживаемую ориентацию интерфейса, а затем добавьте только Портрет (нижняя кнопка главного экрана) и Портрет (верхняя кнопка главного экрана).
Вы можете добавить или удалить ориентацию в соответствии с требованиями вашего проекта.
Благодарность
источник
1) Проверьте настройки вашего проекта и info.plist и убедитесь, что выбраны только те ориентации, которые вам нужны.
2) добавьте следующие методы в самый верхний контроллер представления (контроллер навигации / контроллер панели вкладок)
- (NSUInteger) supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
3) добавьте следующие методы в делегат вашего приложения
- (NSUInteger) supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskPortrait; }
источник
Поместите это в файл .m каждого,
ViewController
который вы не хотите вращать:- (NSUInteger)supportedInterfaceOrientations { //return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft; return UIInterfaceOrientationMaskPortrait; }
См. Здесь для получения дополнительной информации.
источник