自动旋转锁定,以编程方式

时间:2011-05-24 09:13:30

标签: iphone objective-c

有人知道是否有可能只为一个视图以编程方式锁定iPhone的自动旋转? 我想在半透明视图中提供一些帮助,但我想只支持横向,即使所有其他视图都可以旋转。 所以我希望在此视图位于顶部时锁定旋转。

TNX

编辑:更多细节:一个UIController有7个UIView ...我希望锁定自动旋转,就在最后一个发生在顶部时。

7 个答案:

答案 0 :(得分:14)

这个问题是在一年前提出来的,但现在接受的方法是deprecated in iOS 6所以如果有人有兴趣在iOS 6中这样做,那么你需要在最顶层的控制器上使用supportedInterfaceOrientations。

想象一下,你有这样的设置......

  • 标签栏控制器
    • 导航控制器
      • 查看控制器

...然后你需要在标签栏控制器上设置supportedInterfaceOrientations方法。

创建标签栏控制器(或导航控制器,如果它位于顶部)的子类,并在其中设置这些方法......

- (BOOL)shouldAutorotate {
    //Use this if your root controller is a navigation controller
    return self.visibleViewController.shouldAutorotate;
    //Use this if your root controller is a tab bar controller
    return self.selectedViewController.shouldAutorotate;
}

- (NSUInteger)supportedInterfaceOrientations {
    //Navigation Controller
    return self.visibleViewController.supportedInterfaceOrientations;
    //Tab Bar Controller
    return self.selectedViewController.supportedInterfaceOrientations;
}

...然后在您的个人视图控制器中,您可以设置所需的属性...

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations{
    //return supported orientation masks
    return UIInterfaceOrientationMaskLandscape;
}

答案 1 :(得分:4)

使用以下内容......

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

答案 2 :(得分:3)

您可以将其附加到窗口。加载视图后,执行

[self.view.window addSubview:yourStaticView];
[self.view.window bringSubviewToFront:yourStaticView]; // Do only if necessary

离开此视图时将其删除。可能在viewWillDisappear:viewDidDisappear:

答案 3 :(得分:2)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    //If you don't want to support multiple orientations uncomment the line below
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    //return [super shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

答案 4 :(得分:2)

我觉得有很多具体的答案可以间歇性地工作,但是如果用户开始将手机倾斜到外面,则没有人能够提供关于其他应用程序或其他视图控制器的后果或副作用的见解。要控制...的方向的视图控制器

在玩完它之后,你可能会意识到(像我一样)可能会发生不良或不希望的结果(即,当你不想要它们时会发生方向变化,反之亦然)。

我的主要实现涉及只有'根视图控制器'将调用'shouldAutorotate',而不仅仅是您尝试覆盖的任何单个视图控制器。

通过这种实现,似乎很难“锁定”特定视图控制器的特定方向。

(意思是 vc_A始终为肖像,不允许更改为横向,而 vc_B始终为横向且不允许更改为肖像)

在确认之后,以下算法对我来说只能在指定的视图控制器上旋转。

设置:

首先,您必须在info.plist或主项目设置文件中允许所需的方向(这些方向将是您可以在代码中使用的唯一方向)

enter image description here

<强>码

1)在我的根视图控制器(这里:MasterViewController)中,我指定了一个BOOL属性(allowAutorotate),当调用'shouldAutorotate'时将使用该属性。

2)也使根视图控制器成为单例,因此可以从任何其他子视图控制器轻松访问它(无需传递引用)。

注意:您也可以使用观察者/通知模式或委托或其他模式,但对我来说单身模式最简单

3)添加委托' - (BOOL)shouldAutorotate'并利用BOOL allowAutorotate返回

4)创建一个实例方法'setInterfaceOrientation'。其他一些类会在'viewDidLoad'和/或'viewWillDisappear'中调用此方法

// 1)
@implementation MasterViewController {
   BOOL allowAutorotate;
}

// 2)
+ (id)sharedMasterViewController {
   static MasterViewController *sharedMasterViewController = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
     sharedMasterViewController = [[self alloc] init];
   });
   return sharedMasterViewController;
}
- (id)init
{
   self = [super init];
   if (self)
   {
       allowAutorotate = NO;
   }

   return self;
}

// 3)
- (BOOL)shouldAutorotate
{
    return allowAutorotate;
}

// 4)
- (void)setInterfaceOrientation:(NSInteger)orientation
{
   allowAutorotate = YES;

   NSNumber *value = [NSNumber numberWithInt:orientation];
   [[UIDevice currentDevice] setValue:value forKey:@"orientation"];

   allowAutorotate = NO;
}

5)最后在其他一些类中获取根视图控制器并相应地调用'setInterfaceOrientation'

// 5)
#import "MasterViewController.h"

@implementation SomeViewController

- (void)viewDidLoad {
   [super viewDidLoad];
   // Do any additional setup after loading the view.

   [[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIInterfaceOrientationLandscapeRight];
}

- (void)viewWillDisappear:(BOOL)animated
{
   [[MasterViewController sharedMasterViewController] setInterfaceOrientation:UIDeviceOrientationPortrait];
}

备注:

1)此示例的结果应该是应用程序最初将以纵向加载,然后当您加载“SomeViewController”时,它将更改为横向,然后当您将其删除时,它将更改回纵向。 / p>

2)它的工作原理就是这样......

每次你实际倾斜手机时,都会调用代表'shouldAutorotate'(仅来自'根视图控制器'),

每次以编程方式倾斜手机时

NSNumber *value = [NSNumber numberWithInt:orientation];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];

调用委托'shouldAutorotate'。

这就是为什么我们首先'allowAutorotate = YES;',然后'倾斜手机',然后'allowAutorotate = NO;'

因此,我们的结果是只允许/执行方向更改一次,以编程方式,确切地在我们想要的时候。

glhf!

答案 5 :(得分:0)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {                  
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);  
}

答案 6 :(得分:0)

我找到了非常简单且有效的解决方案。通过添加顶视图,我设置了一个BOOL,然后控制旋转。


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations; we support all.

    if (helpViewOnTheTop) {
        return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
    }
    else
    {
        return YES;
    }
}