设备上的间歇性非常明确的方向模拟器

时间:2010-01-22 10:12:44

标签: iphone uikit

我注意到我的设备上出现了非常间歇性的方向。模拟器。

我有一个我提供的模态视图控制器,这是我的应用程序中唯一支持旋转的东西。

如果我在不移动设备的情况下以纵向方式启动应用程序,请打开模式VC然后旋转设备,它通常可以正常工作。但是,有时如果我打开横向拿着设备的应用程序,然后旋转到纵向,启动VC然后旋转设备,不会发生旋转。看起来很间歇。有时,如果我以纵向模式启动应用程序然后打开VC并旋转设备,则没有任何反应,直到我退出并重新启动它,应用程序中才会出现方向。

这很奇怪,因为它有50%的时间可以使用!每当我通过Xcode启动它并在shouldAutorotateToInterfaceOrientation中设置断点时它总是有效!

任何人都有这个或知道发生了什么事?

5 个答案:

答案 0 :(得分:1)

因为你提到“间歇性”,我会说这与你在轮换后做的事情有关。

要找到错误,我建议在轮换发生后删除任何代码。注释掉任何网络活动或OpenGL操作。也可以帮助关闭XCode并重新打开它。

如果没有任何帮助,我会创建一个新项目并开始逐个移动文件并进行测试。

答案 1 :(得分:0)

我有类似的挑战让自动旋转对于父视图控制器不自动旋转的视图控制器正常工作,尽管我的大多数经验都与渲染UINavigationController而不是模态视图控制器有关。不过,我建议您尝试以下方法:

  1. 调用presentModalViewController:在层次结构中的顶层视图控制器上,而不是更深层次的viewController。

  2. 如果这不能解决问题,请尝试继承顶级视图控制器,并覆盖其shouldAutorotateToInterfaceOrientation:看起来像这样:

  3. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        if (self.modalViewController) {
            return [self.modalViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
        }
        return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    }
    

答案 2 :(得分:0)

调用

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

当您显示轮换感知视图帮助时? (当你解雇它时可能会再次关闭它?)

我要寻找的另一件事是对[UIWindow makeKeyWindow][UIResponder becomeFirstResponder]的可疑电话。

我还会注册UIDeviceOrientationDidChangeNotification个事件,并确保Modal视图为您收到的每个事件都拨打[UIViewController shouldAutorotateToInterfaceOrientation:]

答案 3 :(得分:0)

我终于发现了问题所在!

事实证明,只有您添加到UIView的第一个UIWindow才会被问到是否要轮播。任何后续视图都不会收到此消息。我的应用正在使用另一个视图来动画远离启动时显示的Default.png,并且首先将其添加到窗口中!

答案 4 :(得分:-1)

即使您尝试以横向方式启动应用程序,您的手机也会以纵向方式启动它,然后根据手机的位置进入横向。

我不知道你用什么代码来完成这个。以下是摘自Apple代码段的内容。看看这是否有帮助。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)
interfaceOrientation duration:(NSTimeInterval)duration {    
    if (interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        self.view = self.portrait;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
        self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0);  
    }
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft)
    {
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
    }
    else if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.view = self.portrait;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
        self.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0);
    }
    else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.view = self.landscape;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = 
        CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0);
    }
}