iPhone - 太灵敏的旋转检测

时间:2011-01-17 21:10:06

标签: iphone

我有一个基于UIActionSheet的课程。如果检测到设备方向旋转,则此类创建的ActionSheets设计为消失。

所以,当这堂课开始时我有

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

并且在didRotate上:我有解雇,将ActionSheet发送出去。

唯一的小问题是:任何振动都会导致actionSheet解雇。即使用更多的力量敲击也会让popoup消失。即使您在actionSheet中输入内容。

我没有启用任何加速计或coremotion。

任何线索?

感谢


编辑

我发现问题在于,最初将方向报告为UIDeviceOrientationUnknown,并且trepidation使其报告正确的方向。由于UIDeviceOrientationUnknown与正确的方向不同,这被视为轮换更改......

现在我注定了。

3 个答案:

答案 0 :(得分:2)

只需检查您所拥有的interfaceOrientation。从iOS开始,PortraitUp和facedown都支持界面方向。发生在你身上的是那幅肖像(躺在桌子上)正在转向正面,反之亦然。只需检查that即可。请注意,您正在查看UIDevice Orientation,它不是UIInterfaceOrientation!

答案 1 :(得分:2)

很难彻底解决这个问题,因为检测您感兴趣的旋转类型的最佳方法是UIViewController而不是UIView。在UIViewController中你有willRotateToInterfaceOrientation:duration:,它告诉你即将发生自转。此方法在UIViewController上,因为控制器有责任允许或拒绝自动旋转。为了将此信息传达给您的视图,您可以在旋转即将开始时发布NSNotification。然后,您的UIActionSheet子类可以侦听此通知并适当地调整自身形状。或者,您可以向子类添加一个方法,以直接通知它旋转。这取决于您需要在UIView子类中监听自动旋转的频率,以及您对重用的需求有多强。

答案 2 :(得分:0)

在我的情况下,我正在做

if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)
{
//Do Stuff
} 
else
{
//Do Stuff
}

所以我在FACEUP和FACEDown活动中进入了我的其他地方,这是错误的!

if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)
{
//Do Stuff
} 
else if(orientation == UIDeviceOrientationPortrait)
{
//Do Stuff
}