2010-01-22 83 views
5

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

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

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

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

任何人有过这样的事情或知道发生了什么?

+0

没有具体的想法什么是错的,但我想我会问在UI中发生了什么奇怪的事情时我总是问自己:“你在UIKit之外的主线程中调用了什么?” – lawrence 2010-02-03 08:35:01

+0

感谢您的评论。不,我确定我没有这样做!这一切都非常令人费解。 – 2010-03-30 08:18:47

+0

此行为仅在您的应用中发生,还是您在其他应用中看到它行为异常? – Jasarien 2010-03-30 14:08:08

回答

-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); 
    } 
} 
+0

感谢您的回答。这似乎是两个单独的纵向和横向视图之间交换的代码。我只是简单地允许旋转单个视图,纯粹通过在shouldAutorotateToInterfaceOrientation方法中返回YES。 – 2010-04-02 15:00:07

0

我有过类似的挑战越来越自转正确的视图控制器的父视图控制器不自转工作,虽然大部分的我的经验与扯皮的UINavigationController,而不是模态的视图控制器。不过,我会建议您尝试以下操作:

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

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

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

既然你提到的“间歇”,我会说这跟轮换之后你在做什么有关。

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

如果没有什么帮助,我会做一个新的项目,并开始逐个移动文件和测试。

+0

是的,我绝对认为奇怪的事情正在发生。我打算剥离代码,直到它正在工作并解析它。感谢您的建议。 – 2010-05-06 19:30:05

0

是否调用

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

当你告诉你的旋转感知查看帮助? (并可能在关闭它时再次关闭它)

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

我还会注册UIDeviceOrientationDidChangeNotification事件,并确保Modal视图对您收到的每个事件调用[UIViewController shouldAutorotateToInterfaceOrientation:]

+0

感谢您的帮助。我会尝试这些建议并回复你! – 2010-05-06 19:30:49

0

我终于发现了什么问题!

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

相关问题