仅支持iOS 6的一个视图的不同方向

时间:2012-10-07 20:50:13

标签: objective-c ios xcode

我想在我的应用程序中仅旋转我的一个视图,无论是横向左侧还是横向右侧。我的所有其他视图都处于纵向模式,我已将我的应用程序设置为仅支持纵向模式。在iOS 6中改变方向,我不知道如何做到这一点。我试过下面发布的以下内容。谁能告诉我我做错了什么?谢谢!

-(BOOL)shouldAutorotate {
return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{

return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
} 

我也尝试过:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                            name:UIDeviceOrientationDidChangeNotification
                                           object:nil];
return YES;//UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft;
} 


 -(void)didRotate:(NSNotification *)notification {
 UIDeviceOrientation orientation = [[notification object] orientation];

if (orientation == UIDeviceOrientationLandscapeLeft) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
} else if (orientation == UIDeviceOrientationLandscapeRight) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
} else if (orientation == UIDeviceOrientationPortrait) {
    [theImage setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
}
}

7 个答案:

答案 0 :(得分:19)

这对我有用How to force a UIViewController to Portrait orientation in iOS 6

从UINavigationController创建一个新类别,覆盖旋转方法:

-(BOOL)shouldAutorotate
{
    return [self.topViewController shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [self.topViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.topViewController preferredInterfaceOrientationForPresentation];
}

@end 

答案 1 :(得分:6)

iOS 6中有关于处理视图旋转的更改。 仅支持在应用Info.plist中定义的方向。即使你要归还其他人。

尝试选择项目支持的所有方向。

  

处理视图轮播

     

在iOS 6中,您的应用支持应用的Info.plist文件中定义的界面方向。视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表。通常,系统仅在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕;子视图控制器使用由父视图控制器为其提供的窗口部分,不再直接参与有关支持哪些旋转的决策。应用程序的方向遮罩和视图控制器的方向遮罩的交点用于确定视图控制器可以旋转到哪个方向。

     

您可以覆盖旨在以特定方向全屏显示的视图控制器的preferredInterfaceOrientationForPresentation

     

在iOS 5及更早版本中,UIViewController类仅以纵向模式显示视图。要支持其他方向,必须覆盖shouldAutorotateToInterfaceOrientation:方法,并为子类支持的任何方向返回YES。如果正确配置了视图的自动调整属性,则可能只需要执行此操作。但是,UIViewController类为您提供了额外的挂钩,以便根据需要实现其他行为。通常,如果您的视图控制器旨在用作子视图控制器,它应该支持所有接口方向。

     

当可见视图控制器发生旋转时,在旋转期间会调用willRotateToInterfaceOrientation:duration:,willAnimateRotationToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:方法。调整视图大小并由其父视图定位后,也会调用viewWillLayoutSubviews方法。如果在发生方向更改时视图控制器不可见,则永远不会调用旋转方法。但是,当视图变为可见时,将调用viewWillLayoutSubviews方法。您对此方法的实现可以调用statusBarOrientation方法来确定设备方向。

(C)Apple Docs: UIViewController

答案 2 :(得分:2)

按照以下步骤

  • 创建UINavigationController的子类,覆盖旋转方法。
  • 在AppDelegate中,创建一个BOOL islandscape 属性。
  • 当按下/ poped / present / dismiss视图时,调整此BOOL值。

示例项目

我为此创建了一个完美的示例项目。下载并集成到您的项目中:https://www.dropbox.com/s/nl1wicbx52veq41/RotationDmeo.zip?dl=0

答案 3 :(得分:0)

我有一个:

  

TabbarController - > NavigationController - > ViewController - >的ViewController

我进行了Subclassed UITabBarController并添加....

-(NSUInteger)supportedInterfaceOrientations{
    if (self.selectedIndex >= 0 && self.selectedIndex < 100) {
        for (id vC in [[self.viewControllers objectAtIndex:(unsigned long)self.selectedIndex] viewControllers]) {
            if ([vC isKindOfClass:[CLASS_WHICH_SHOULD_ALLOW class]]) {
                return UIInterfaceOrientationMaskPortrait + UIInterfaceOrientationMaskLandscape;
            }
        }
    }
    
    return UIInterfaceOrientationMaskPortrait;
}

答案 4 :(得分:0)

我一直在寻找解决方案几个小时!

所以在各地实施所需的方法之后。 shouldAutorotate不需要设置为YES,因为它已设置为默认值:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
     return UIInterfaceOrientationPortrait;
}

当需要显示需要与其他视图不同的方向的UIViewController时,我在内部创建了一个UIStoryboardSegue

#import "Showing.h"

@implementation Showing

- (void)perform{
    NSLog(@"Showing");
    UIViewController *sourceVC = self.sourceViewController;
    UIViewController *presentingVC = self.destinationViewController;

    [sourceVC.navigationController presentViewController:presentingVC 
                                                animated:YES 
                                              completion:nil];
}

@end

UIStoryboard内,我用这个segue连接了视图(显示):

enter image description here

重要的是,你正在使用

presentViewController:animated:completion:

AND NOT

pushViewController:animated:

否则将不再确定方向。

<小时/> 我一直在尝试像

这样的事情
[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

这个方向应该更改的UIViewController内的这个,我也尝试在UIStoryboardSegues和{{{{}}之前在我的自定义presentingViewController内调用它1}}:

dismissViewController

[UIViewController attemptRotationToDeviceOrientation];

但他们中没有人工作过。当然最后一个例子不应该是一个选项,因为如果苹果会改变他们api的任何内容,这可能会导致你的应用程序内部出现问题。

我还尝试使用NSNumber *numPortrait = [NSNumber numberWithInt:UIInterfaceOrientationPortrait]; [[UIDevice currentDevice] setValue:numPortrait forKey:@"orientation"]; 方法,并在查找实际AppDelegate的正确UIInterfaceOrientation后始终确定此方法内的方向,但有时在切换时有时会崩溃从一个到另一个方向。所以我仍然想知道为什么它变得如此复杂,似乎也没有任何文档可以正确解释。 甚至关注this part didn't help我。

答案 5 :(得分:0)

的UIViewController + OrientationPermissions.h

@interface UIViewController (OrientationPermissions)
   + (void)setSupportedOrientations:(UIInterfaceOrientationMask)supportedOrientations;
   + (UIInterfaceOrientationMask)supportedOrientations;
@end

的UIViewController + OrientationPermissions.m

@implementation UIViewController (OrientationPermissions)
static UIInterfaceOrientationMask _supportedOrientations;

+ (void)setSupportedOrientations:    (UIInterfaceOrientationMask)supportedOrientations {
    _supportedOrientations = supportedOrientations;
}

+ (UIInterfaceOrientationMask)supportedOrientations {
    return _supportedOrientations;
}

@end

在您的UIApplication代表

- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return [UIViewController supportedOrientations];
}

然后在所需的视图控制器上执行类似

的操作
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [UIViewController setSupportedOrientations:UIInterfaceOrientationMaskAll];
}

在离开此视图控制器之前,请不要忘记重置遮罩

注意,如果您使用的是UINavigationController或UITabBarController,请参阅https://stackoverflow.com/a/28220616/821994如何绕过

答案 6 :(得分:-2)

反向工作请尝试。 我在2天后解决了

// 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;
}