iOS5、iOS6、旋转、事件任意触发

Posted

技术标签:

【中文标题】iOS5、iOS6、旋转、事件任意触发【英文标题】:iOS5, iOS6, rotation, event firing arbitrarily 【发布时间】:2013-03-01 16:12:30 【问题描述】:

我有一个支持方向更改和相应旋转的应用程序。我听事件 UIApplicationWillChangeStatusBarOrientationNotification。现在,在加载这个应用的过程中,我添加了一些视图,并根据当前方向在我的应用中设置它们。

ios 6 中,这可以正常工作,并且应用程序可以正确响应和旋转,因此用户可以在横向和纵向模式下加载,并且代码可以正常工作。

在 iOS 5 中,如果我以纵向模式加载应用程序,应用程序工作正常,并且一旦以纵向模式完成加载,并且 UI 对齐和调整大小,它将响应横向或横向的其他方向更改肖像。我遇到的问题是:在横向模式下加载 iOS 5 时,在将带有 iOS 5 的设备物理放置在平面上以确保其横向时,我得到一个从横向移动到纵向的 OrientationNotification(尽管设备没有改变)。

因此,在同一实验中,另一台设备 iOS 6 加载正常,我没有收到任何奇怪的旋转更改事件,但在 iOS 5 中我确实收到了!

有什么想法吗?

我支持两个 iOS 的方向

- (BOOL)shouldAutorotate 
    return YES;


- (BOOL)shouldAutorotateToInterfaceOrientation:
                                   (UIInterfaceOrientation)interfaceOrientation 
    return (interfaceOrientation == UIInterfaceOrientationPortrait ||
            interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
            interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown ||
            interfaceOrientation == UIInterfaceOrientationLandscapeRight);

【问题讨论】:

【参考方案1】:

听起来 iOS 5 认为事物应该是纵向的,如果实际上没有物理方向(即平向上或向下)而 iOS 6 没有。为了确定在重要时显示内容的方向可能值得,我在可用时使用实际设备方向,在设备平坦时使用状态栏方向。例如:

// Get a useful screen orientation.
// If the device is physically in portrait or landscape then
// that is the orientation.
// If it is not, then it is probably flat on a table and use
// the orientation of the status bar which should be set to
// the last physical orientation.
//
// screen Orientation
//------------------------------------------------------------
+ (UIDeviceOrientation) screenOrientation 
   UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
   if (orientation!=UIInterfaceOrientationPortrait
       && orientation!=UIInterfaceOrientationPortraitUpsideDown
       && orientation!=UIInterfaceOrientationLandscapeLeft
       && orientation != UIInterfaceOrientationLandscapeRight) 
       // Not known at this time.  Use the status bar orientation
       orientation = [[UIApplication sharedApplication] statusBarOrientation];
   
    return orientation;

我不确定这是否会直接帮助您,但也许在您的通知处理程序中,您可以查看实际的状态栏方向是什么。或者,通知的时间安排和状态栏方向的更改可能不起作用。

【讨论】:

以上是关于iOS5、iOS6、旋转、事件任意触发的主要内容,如果未能解决你的问题,请参考以下文章

应用程序仅在 iOS 6 中旋转,在 iOS 5 中不旋转

iOS 5 查看事件顺序更改

MVVM // 在 Activity 旋转时触发 ViewModel 事件(重新创建)

如何在 UIScrollview 中触发 UIViewcontroller 视图的旋转事件

目标 c 中的多日活动

iOS6 和 iOS5 中 UIImage Orientation 的不同行为