旋转表现不同的iOS6的(Rotation behaving differently on iOS6

2019-06-18 05:53发布

我做了一个应用,该应用是标签为主。 没有什么需要在横向模式,但一对夫妇的意见。 它的工作确定在iOS5中,我为这个结果非常满意。 然而,随着iOS6的和不与任何东西搞乱,现在所有旋转的意见和后果不是很好。

由于其基于选项卡的应用程序,我需要在景观夫妇的观点是modalViews。 这样,我没有用的TabBar不乱,我不得不只选择肖像“支持面向”对构建选项和设置的设置:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft);
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

在视图上,我想景观。

现在,随着iOS6的这个意见也都在纵向模式,不管是什么,他们不表明横向模式,即使我旋转设备。 同样,如果我允许在“支持的方向”,他们都旋转,所有的方位不管我把上面的方法。

在各方面的意见我没有检查故事板箱“使用自动布局”。

任何帮助这里?

* 编辑 **现在,我看到它时,应用程序我有在设备上正常工作。 我已经安装了促销代码,而不是从Xcode中,只看到我的客户是否有问题或不。 Fortunatelly他们不是。 该问题,但仍然存在。

Answer 1:

我发现这个问题的文件中最重要的部分是:

当用户改变设备方向时,系统调用根视图控制器上或填充所述窗口这种方法最上面的呈现视图控制器

为了让我的应用程序在iOS 6中完全工作自转,我必须做到以下几点:

1)I创建的UINavigationController的新子类,并加入shouldAutorotate和supportedInterfaceOrientation方法:

// MyNavigationController.h:
#import <UIKit/UIKit.h>

@interface MyNavigationController : UINavigationController

@end

// MyNavigationController.m:
#import "MyNavigationController.h"
@implementation MyNavigationController
...
- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}
...
@end

2)在AppDelegate中,我也用我的新的子类,以显示我的根视图控制器(它是introScreenViewController,一个UIViewController子类)并没有设置self.window.rootViewController,所以它看起来是:

    nvc = [[MyNavigationController alloc] initWithRootViewController:introScreenViewController];
    nvc.navigationBarHidden = YES;
    self.window.rootViewController = nvc;
    [window addSubview:nvc.view];
    [window makeKeyAndVisible];


Answer 2:

这是iOS6的替代解决方案的情况下,正在使用的标签栏控制器。 这也表明,不需要重写UINavigationController的甚至的UITabBarController。

在您的xyzAppDelegate.h添加此界面:

@interface UITabBarController (MyApp)
@end

而在xyzAppDelegate.m添加这些方法:

@implementation UITabBarController (MyApp) 

-(BOOL)shouldAutorotate
{
  return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
  // your custom logic for rotation of selected tab
  if (self.selectedIndex==...) {
    return UIInterfaceOrientationMaskAll;
  } 
  else {
    return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown;
  }
}

@end

另外,设定为应用程序窗口中的根视图控制器:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  ...
  [self.window setRootViewController:tabBarController];


Answer 3:

你要为在委托RootViewController的? 例如,

    self.window.rootViewController = self.navigationController;

当我做一些iOS6的测试,直到我这样做,它不会正常工作...



Answer 4:

我有交叉5.0至6.0的工作一个很好的解决方案 - 上述所有的用

-(BOOL)shouldAutorotate{return [self shouldIRotateAnyiOS];}//iOS6

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{return [self shouldIRotateAnyiOS];}//pre iOS6

-(BOOL)shouldIRotateAnyiOS{
UIInterfaceOrientation interfaceOrientation = [[UIDevice currentDevice] orientation];
//do the rotation stuff
return YES
}


Answer 5:

你可能会仔细检查支持接口取向

在以前的版本中,这意味着什么,但现在影响整个应用程序。

注:“倒挂”选项甚至没有启用或iOS 6的残疾人工作。



Answer 6:

这是我的作品。

我创建的UINavigationController的一个新的子类,并添加shouldAutorotate和supportedInterfaceOrientation方法:

#import "MyNavigationController.h"

@interface MyNavigationController ()

@end

@implementation MyNavigationController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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

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

@end

然后添加到您的委托

UINavigationController *nvc = [[MyNavigationController alloc] initWithRootViewController:_viewController];
nvc.navigationBarHidden = NO; // YES if you want to hide the navigationBar
self.window.rootViewController = nvc;
[_window addSubview:nvc.view];
[_window makeKeyAndVisible];

现在你可以添加这要在所有方向旋转的意见

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

-(BOOL)shouldAutorotate
{
    return YES;
}

或者这添加到您的意见只想要去的肖像和portraitUpsideDown

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return
    (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown ;
}

- (BOOL)shouldAutorotate
{
    return YES;
}


Answer 7:

还有,你可能需要处理得到这个工作,因为与iOS6的自动旋转的结构已经改变了一些东西。 现在的自动旋转是如何确定的结构是相反的。 它曾经是一个单独的视图控制器可以控制其决定自动旋转,但现在的“shouldAutorotate”是由导航而你的情况是使用TabBar最高父决定。

  1. 你需要确保你的窗口有RootViewController的集合,而不只是添加为子视图。
  2. 您可能需要继承你的tabBarController同时实现“supportedInterfaceOrientations”和“shouldAutorotate”。
  3. 如果有需要不同的行为任何viewControllers,那么你将需要有你tabBarController与他们咨询,了解他们是否应该自动旋转答案。

例如:

- (BOOL)shouldAutorotate
{
    return self.selectedViewController.shouldAutorotate;
}

在您的视图控制器,你将实现shouldAutorotate并决定在那里。



Answer 8:

从苹果公司的文档shouldAutorotateToInterfaceOrientation:

重写supportedInterfaceOrientations和preferredInterfaceOrientationForPresentation方法,而不是。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/UIViewController/shouldAutorotateToInterfaceOrientation :



Answer 9:

对于应用“相同的图片”关于iOS6的,我需要改变方向时,我的UIViewController从不为取向被告知,这是一个照片叠加可能didrotate效果很好:

- (void)didRotate: ( NSNotification* )note
{
    [self performSelector:@selector(rotateRecalculDiffere) withObject:nil afterDelay:0.3 ];
}

我做精细尺寸与延迟呼叫调整。 从通知可以很容易地知道最终方向



Answer 10:

做了一些实验:拍摄的现有应用(即不会在IOS-6旋转,但以前一样)中并加入一条线self.window.rootViewController = navCtlr; 到AppDelegate中。 这导致出现(至少乍一看)旋转就好的应用程序。

于是,出于好奇,我创建了RotationCanary类和插入的那一个实例为self.window.rootViewController。 我启动的应用程序,并等待不可避免的“无法识别的选择”,创建一个名称的RotationCanary的新方法,并重新运行。 新方法将调用真正的资产净值和CTLR返回之前登录其响应。 这产生(早于我的预期)以下日志:

2012-12-07 13:08:47.689 MyTestApp[53328:c07] System Version is 6.0;    Supported versions are 5.0.x to 6.0.x
2012-12-07 13:08:47.691 MyTestApp[53328:c07] Host memory (in bytes) used: 3489513472 free: 803893248 total: 4293406720
2012-12-07 13:08:47.692 MyTestApp[53328:c07] Memory in use by task (in bytes): 23719936
2012-12-07 13:08:47.695 MyTestApp[53328:c07] Creating database
2012-12-07 13:08:47.699 MyTestApp[53328:c07] Item Selected: (null)  (null)
2012-12-07 13:08:47.700 MyTestApp[53328:c07] <DetailViewController.m:(27)> Entering Method -[DetailViewController viewDidLoad]
2012-12-07 13:08:47.706 MyTestApp[53328:c07] <SplitContentViewController.m:(57)> Entering Method -[SplitContentViewController viewDidLoad]
2012-12-07 13:08:47.708 MyTestApp[53328:c07] <FamilyMasterViewController.m:(32)> Entering Method -[FamilyMasterViewController viewDidLoad]
2012-12-07 13:08:47.709 MyTestApp[53328:c07] <MasterViewController.m:(41)> Entering Method -[MasterViewController viewDidLoad]
2012-12-07 13:08:47.718 MyTestApp[53328:c07] <FamilyHomeDetailViewController.m:(51)> Entering Method -[FamilyHomeDetailViewController viewDidLoad]
2012-12-07 13:08:47.820 MyTestApp[53328:c07] -[RotationCanary _preferredInterfaceOrientationGivenCurrentOrientation:] - current = 2, result = 2
2012-12-07 13:08:47.821 MyTestApp[53328:c07] -[RotationCanary _existingView] - view = (null)
2012-12-07 13:08:47.824 MyTestApp[53328:c07] -[RotationCanary view] - view = <UILayoutContainerView: 0x9c987f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x9c8fa00>>
2012-12-07 13:08:47.825 MyTestApp[53328:c07] -[RotationCanary view] - view = <UILayoutContainerView: 0x9c987f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x9c8fa00>>
2012-12-07 13:08:47.826 MyTestApp[53328:c07] -[RotationCanary view] - view = <UILayoutContainerView: 0x9c987f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x9c8fa00>>
2012-12-07 13:08:47.827 MyTestApp[53328:c07] -[RotationCanary wantsFullScreenLayout] - result = YES
2012-12-07 13:08:47.827 MyTestApp[53328:c07] -[RotationCanary view] - view = <UILayoutContainerView: 0x9c987f0; frame = (0 0; 768 1024); autoresize = W+H; layer = <CALayer: 0x9c8fa00>>
2012-12-07 13:08:47.830 MyTestApp[53328:c07] -[RotationCanary _tryBecomeRootViewControllerInWindow:] - window = <UIWindow: 0x9c76320; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x9c76450>>, result = YES
2012-12-07 13:08:47.916 MyTestApp[53328:c07] -[RotationCanary _deepestDefaultFirstResponder] - result = <SignOnViewController: 0x9c942a0>
2012-12-07 13:08:47.916 MyTestApp[53328:c07] Device model: x86_64

奇怪的是,类以前从来没有实际调用执行旋转 - 仅在安装过程。

我怀疑,苹果使用RootViewController的的设置纯粹,以此来表明该应用程序已被修改为iOS 6的旋转-它没有真正的功能并非如此。

FWIW:我想到的是,来电者可能会使用respondsToSelector并跳过几个电话,所以我加的实现resolveInstanceMethod:到RotationCanary,以捕获任何这种企图。 无发生。



Answer 11:

在自转的iOS 6.0改变。 检查此链接以获取更多信息。

自转是在IOS 6改变在iOS 6中,所述shouldAutorotateToInterfaceOrientation:UIViewController中的方法已被弃用。 在其位,你应该使用supportedInterfaceOrientations和shouldAutorotate方法。



Answer 12:

这对于普通的iOS5和iOS6的代码

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
        [self performSelector:@selector(setframeLandscap) withObject:nil afterDelay:0.2];
    }
    else {
        [self performSelector:@selector(setframePortrait) withObject:nil afterDelay:0.2];
    }
}

-(BOOL)shouldAutorotate {    
    return YES;
}


文章来源: Rotation behaving differently on iOS6