Iphone 设备上非常间歇性的定向&;模拟机

Iphone 设备上非常间歇性的定向&;模拟机,iphone,uikit,Iphone,Uikit,我注意到我在我的设备&模拟器上得到了非常断断续续的定向 我有一个模态视图控制器,我现在,这是我的应用程序中唯一的东西,支持旋转 如果我在不移动设备的情况下以纵向方式启动应用程序,打开模式VC,然后旋转设备,它通常会工作。但是,有时如果我打开应用程序,将设备固定在横向位置,然后旋转到纵向位置,启动VC,然后旋转设备,则不会发生旋转。这似乎是断断续续的。有时,如果我在纵向模式下启动应用程序,然后打开VC并旋转设备,什么都不会发生,直到我退出并重新启动它,应用程序中才会出现方向 这很奇怪,因为它有50

我注意到我在我的设备&模拟器上得到了非常断断续续的定向

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

如果我在不移动设备的情况下以纵向方式启动应用程序,打开模式VC,然后旋转设备,它通常会工作。但是,有时如果我打开应用程序,将设备固定在横向位置,然后旋转到纵向位置,启动VC,然后旋转设备,则不会发生旋转。这似乎是断断续续的。有时,如果我在纵向模式下启动应用程序,然后打开VC并旋转设备,什么都不会发生,直到我退出并重新启动它,应用程序中才会出现方向

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


任何人都有过这样的经历或知道发生了什么吗?

即使您尝试在横向环境中启动应用程序,您的手机也会在纵向环境中启动应用程序,然后在横向环境中启动应用程序,具体取决于您的手机所处的位置

我不知道你用什么代码来完成这个任务。下面是一段摘自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);
    }
}

对于父视图控制器不自动旋转的视图控制器,要使自动旋转正常工作,我也遇到过类似的挑战,尽管我的大部分经验都与争论UINavigationController而不是模态视图控制器有关。尽管如此,我还是建议尝试以下方法:

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

  • 如果这还不能解决问题,请尝试将顶层视图控制器子类化,并覆盖其shouldAutorotateToInterfaceOrientation:以如下方式显示:

  • 因为正如你提到的“间歇性”,我想说这与你在轮换后的表现有关

    为了找到bug,我建议在旋转发生后删除所有代码。注释掉任何网络活动或OpenGL操作。还可以帮助关闭XCode并重新打开它

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

    调用

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    
    当您显示旋转感知视图帮助时?(当您关闭它时,可能会再次关闭它?)

    我要寻找的另一件事是对
    [UIWindow makeKeyWindow]
    [UIResponder becomeFirstResponder]
    的可疑调用


    我还将注册
    UIDeviceOrientationIDChangeNotification
    事件,并确保模态视图为您收到的每个事件调用
    [UIViewController shouldAutorotateToInterfaceOrientation::

    我终于发现了问题所在


    事实证明,只有添加到
    ui窗口的第一个
    ui视图
    才会被询问是否旋转。任何后续视图都不会收到此消息。我的应用程序使用另一个视图来设置动画,使其远离启动时显示的
    Default.png
    ,这是首先添加到窗口的

    不知道到底出了什么问题,但我想当UI中发生奇怪的事情时,我会问自己:“你在UIKit中调用主线程之外的任何东西吗?”谢谢你的评论。不,我肯定我没那么做!这一切都非常令人费解。这种行为是只发生在你的应用程序中,还是你在其他应用程序中也看到了它的不当行为?只有这一个应用程序。我已经创建了一个新项目,它在模拟器和设备中都能正常工作。谢谢你的回答。这似乎是在两个单独的纵向和横向视图之间交换的代码。我只是简单地允许一个视图的旋转,在shouldAutorotateToInterfaceOrientation方法中返回YES。是的,我肯定认为发生了一些奇怪的事情。我计划剥离代码,直到它开始工作,并以这种方式剖析它。谢谢你的建议。谢谢你的帮助。我会尝试一下这些建议,然后再给你回复!
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];