2011-04-06 88 views
0

嘿家伙,对不起,如果我是这个新手,我环顾四周,但还没有完全发现如何做到这一点。基本上我想使用iPhone的加速度计切换视图。例如,假设iPhone坠落,该动作会触发它切换到另一个视图,告诉用户手机已经掉落。任何帮助如何做到这一点将不胜感激,谢谢。使用UIAccelerometer切换视图

回答

2

可以使用UIAccelerometer类读取加速计,该类将加速计值调用到其UIAccelerometerDelegate协议委托。这意味着:

.h文件:

@interface TestView: UIViewController <UIAccelerometerDelegate> { 
    UIAccelerometer *accelerometer; 
} 

@property (nonatomic, retain) UIAccelerometer *accelerometer; 

@end 
在M档

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.accelerometer = [UIAccelerometer sharedAccelerometer]; 
    self.accelerometer.updateInterval = .1; 
    self.accelerometer.delegate = self; 
} 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {  
    float aX = ABS(acceleration.x); 
    float aY = ABS(acceleration.y); 
    float aZ = ABS(acceleration.z); 
    if(sqrt(aX*aX+aY*aY+aZ*aZ)>THRESHOLD){ 
    //Load new view here  
    } 
} 

你可以选择门槛,是你希望它是什么。这意味着加速度矢量的长度超过了某个值。我认为如果没有移动,这个值通常是1左右,如果有一些移动,这个值通常会更高。我会建议设置这样的1.5可能吗?你可以自己尝试不同的值。

希望这会有所帮助!

+0

嗨,感谢您的帮助,项目的构建和运行没有任何问题,但在加速计触发并即将更改视图时崩溃。我得到的错误消息是: ****由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试在转换已经进行时开始从的模态转换。等待viewDidAppear/viewDidDisappear知道当前转换已完成' 再次感谢, – 2011-04-06 20:19:28

+0

我不确定是否我写的加载新视图的代码是正确的,也许这是问题? 'SecondViewController * screen = [[SecondViewController alloc] initWithNibName:nil bundle:nil]; \t \t screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical; \t \t [self presentModalViewController:screen animated:YES]; \t \t [screen release];' – 2011-04-06 20:22:55

+0

你的代码似乎很好。您得到的错误是因为您正尝试在当前转换仍在运行时启动转换。不要忘记,每次移动你的iPhone时,“加速度计:didAccelerate”函数都会被调用。一种解决方案是在if语句后面执行以下代码行:'self.accelerometer.delegate = nil;'这会阻止将来调用该函数。希望这可以帮助! – Tovi7 2011-04-06 20:41:29