在我的应用我有多个意见,一些看法需要支持纵向和横向的,而其他的观点仅需要支持肖像。 因此,在项目总结,我都选择了所有的方向。
下面的代码努力之前iOS 6的给定视图控制器上禁用横向模式:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
由于shouldAutorotateToInterfaceOrientation在iOS6的不赞成我把它换成了上面:
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMask.Portrait;
}
这种方法被称为正确的看法出现时(我可以设置断点,以确保这一点),但仍然接口旋转为横向模式不管事实,我要回只肖像模式面具。 我究竟做错了什么?
看来,这是目前不可能建立有按次取向不同需求的应用程序。 它似乎只能坚守在项目总结中指定的方向。
Answer 1:
如果您正在使用一个UINavigationController作为根窗口控制器 ,这将是其 shouldAutorotate
& supportedInterfaceOrientations
这将被调用。
同上,如果你正在使用的UITabBarController,等等。
所以,我们该做的是继承您的导航/的TabBar控制器,并覆盖其shouldAutorotate
& supportedInterfaceOrientations
方法。
Answer 2:
尝试在AppDelegate.m更改此代码
// self.window.rootViewController = self.navigationController;
[window setRootViewController:navigationController];
这是完整的答案
shouldAutorotateToInterfaceOrientation不会被调用在iOS 6中
XD
Answer 3:
在我来说,我有UINavigationController的和我的视图控制器内。 我不得不UINavigationController的子类,并以只支持肖像,添加这个方法:
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}
所以在UINavigationController的子类,我需要检查什么方向由当前topViewController支持。
- (NSUInteger)supportedInterfaceOrientations
{
return [[self topViewController] supportedInterfaceOrientations];
}
Answer 4:
有一件事我发现是,如果你有一个旧的应用程序,现在还在做
[window addSubView:viewcontroller.view]; //This is bad in so may ways but I see it all the time...
您将需要更新到:
[window setRootViewController:viewcontroller]; //since iOS 4
一旦你这样做的方向应该开始重新工作。
Answer 5:
为iOS6的最好的办法明确由雷Wenderlich队“iOS6的通过教程”指出- 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;
}
Answer 6:
正如其他人,如果你使用一个UINavigationController,并表示要自定义各种意见,你会想要子类的UINavigationController,并确保你有这两个组成部分:
@implementation CustomNavigationController
// -------------------------------------------------------------------------------
// supportedInterfaceOrientations:
// Overridden to return the supportedInterfaceOrientations of the view controller
// at the top of the navigation stack.
// By default, UIViewController (and thus, UINavigationController) always returns
// UIInterfaceOrientationMaskAllButUpsideDown when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
// -------------------------------------------------------------------------------
// shouldAutorotate
// Overridden to return the shouldAutorotate value of the view controller
// at the top of the navigation stack.
// By default, UIViewController (and thus, UINavigationController) always returns
// YES when the app is run on an iPhone.
// -------------------------------------------------------------------------------
- (BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
然后,在这是一个纵向的任何视图只有你将包括:
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
而在这一切却颠倒的任何观点:
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
Answer 7:
基本上有人如上所述,但在更多详细信息:
- 创建一个新的文件,是的UINavigationController的一个子类
- 转到您的故事板,然后点击导航控制器,它的类设置为您刚刚创建的
在这个类(.m文件)添加以下代码,以便它会留在人像模式:
(BOOL)shouldAutorotate { return NO; } (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
这为我工作
Answer 8:
此代码为我工作:
-(BOOL)shouldAutorotate {
return YES;
}
-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
iPhone / iPad应用定位检查出我自己的答案
Answer 9:
我认为最好的办法是做一个分类,而不是继承UINavigationController
或UITabbarController
您的UINavigationController + Rotation.h
#import <UIKit/UIKit.h>
@interface UINavigationController (Rotation)
@end
您的UINavigationController + Rotation.m
#import "UINavigationController+Rotation.h"
@implementation UINavigationController (Rotation)
-(BOOL)shouldAutorotate
{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
试着让你的所有控制器进口这一类,这工作就像一个魅力。 你甚至可以使控制器不转动,并且推动另一个控制器,将旋转。
Answer 10:
Answer 11:
首先,为了使只有你应该返回模式下您的应用程序的工作UIInterfaceOrientationMaskLandscape
。 如果你想保持唯一的肖像模式,你在做正确的事情。
只需添加UISupportedInterfaceOrientations
在Info.plist中键并指定接口的方向看重你的应用打算继续。
此外,你应该从返回false shouldAutoRotate
如果你想避免自动旋转完全。 不过,我建议你从这里返回true,并指定了正确的方向supportedInterfaceOrientations
方法。
Answer 12:
我有同样的情况,你。 我知道你已经接受一个答案,但我想我反正再添一个。 这是我理解的旋转系统的新版本的工作方式。 根视图控制器是有史以来被称为唯一的视图控制器。 其理由,我认为,这是与子视图控制器是没有意义的,因为往往他们会仅仅停留在根视图控制器的框架内,无论如何旋转自己的看法。
那么,会发生什么情况。 第一shouldAutorotate
称为根视图控制器上 。 如果NO
则返回一切都停止。 如果YES
则返回supportedInterfaceOrientations
方法被调用。 如果接口取向在此方法无论从Info.plist中或应用程序委托全球支撑取向证实,那么该观点旋转。 旋转之前shouldAutomaticallyForwardRotationMethods
方法进行查询。 如果YES
(默认值),那么所有的孩子都会收到will
和didRotateTo...
方法以及父(他们又将其转发给自己的孩子)。
我的解决方案(直到有一个更雄辩的一个)是在查询的最后一个子视图控制器supportedInterfaceOrientations
方法并返回其值。 这让我转动部分地区,而只保留他人肖像。 我知道这是脆弱的,但我没有看到另一种方式,不涉及与事件调用,回调等复杂的事情
Answer 13:
如果您使用UINavigationController
,你必须实现shouldAutorotate
和supportedInterfaceOrientations
在子类中UINavigationController
。
这些能够通过两个步骤来控制,如果shouldAutorotate
返回YES然后有效supportedInterfaceOrientations
。 这是一个非常好的组合。
这个例子,我的主要观点是,除了肖像和CoverFlowView PreviewView。 该CoverFlowView转移到PreviewView,PreviewView要遵循CoverFlowCView的旋转。
@implementation MyNavigationController
-(BOOL)shouldAutorotate
{
if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"PreviewView")])
return NO;
else
return YES;
}
-(NSUInteger)supportedInterfaceOrientations
{
if ([[self.viewControllers lastObject] isKindOfClass:NSClassFromString(@"CoverFlowView")])
return UIInterfaceOrientationMaskAllButUpsideDown;
else
return UIInterfaceOrientationMaskPortrait;
}
...
@end
Answer 14:
我的解决办法:子类UINavigationController
并将其设置为window.rootViewController
层次结构的顶部视图-控制将采取定向,一些代码示例的控制: 子类的UINavigationController
Answer 15:
这些问题的答案在这里指出我在正确的方向,虽然我无法得到它,因为我使用的UITabBarController内UINavigationControllers的只是削减和粘贴工作。 所以,我在AppDelegate.m版本看起来是这样的,这将为一个的UITabBarController内UITabBarControllers,UINavigationControllers或UINavigationControllers工作。 如果使用的是其他定制遏制控制器,则需要在此处添加(这是怎样的一个令人失望的)。
- (UIViewController*)terminalViewController:(UIViewController*)viewController
{
if ([viewController isKindOfClass:[UITabBarController class]])
{
viewController = [(UITabBarController*)viewController selectedViewController];
viewController = [self terminalViewController:viewController];
}
else if ([viewController isKindOfClass:[UINavigationController class]])
{
viewController = [[(UINavigationController*)viewController viewControllers] lastObject];
}
return viewController;
}
- (NSUInteger)application:(UIApplication *)application
supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
NSUInteger orientations = UIInterfaceOrientationMaskPortrait;
UIViewController* viewController = [self terminalViewController:window.rootViewController];
if (viewController)
orientations = [viewController supportedInterfaceOrientations];
return orientations;
}
另外需要注意的关键问题是,你必须覆盖supportedInterfaceOrientations在UIViewController的子类,否则将默认在您的Info.plist指定什么。
文章来源: iOS6: supportedInterfaceOrientations not working (is invoked but the interface still rotates)