0

有没有办法检测到屏幕即将旋转,又能防止这样的旋转发生?本质上,我正在尝试实现一个类似内置相机应用程序的界面,其中当设备从纵向移动到横向(反之亦然)时,控制对象旋转到位,但子视图的布局实际上并没有改变。

我可以通过以下方式获得有关设备方向更改的通知:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(deviceOrientationDidChange:)
    name:UIDeviceOrientationDidChangeNotification
    object:nil];

我可以通过将纵向设置为唯一支持的方向来完全防止旋转,但如果我这样做, UIDeviceOrientationDidChangeNotification 根本不会触发。

有没有办法让我把蛋糕也吃掉?

谢谢,

A.炖凹痕

4

1 回答 1

0

您仍然可以使您的应用程序仅支持纵向,防止旋转,并使用加速度计捕捉旋转动作。

这是一些执行此操作的代码:

头文件:

@interface MyController : UIViewController <UIAccelerometerDelegate>

@property(nonatomic, assign) UIInterfaceOrientation interfaceOrientation;

@end

在实现文件中:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration*)acceleration;
{
    CGFloat x = -[acceleration x];
    CGFloat y = [acceleration y];
    CGFloat angle = atan2(y, x);

    if ( angle >= -2.25f && angle <= -0.25f )
    {
        self.interfaceOrientation = UIInterfaceOrientationPortrait;
    }
    else if ( angle >= -1.75f && angle <= 0.75f )
    {
        self.interfaceOrientation = UIInterfaceOrientationLandscapeRight;
    }
    else if( angle >= 0.75f && angle <= 2.25f )
    {
        self.interfaceOrientation = UIInterfaceOrientationPortraitUpsideDown;
    }
    else if ( angle <= -2.25f || angle >= 2.25f )
    {
        self.interfaceOrientation = UIInterfaceOrientationLandscapeLeft;
    }
}

只要记住在某处取消加速度计,就像在你的 viewWillDisappear 中一样:

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];

}

请给一些反馈,如果工作与否。

于 2013-07-25T23:04:09.797 回答