【问题标题】:Switching views using the UIAccelerometer使用 UIAccelerometer 切换视图
【发布时间】:2011-04-06 15:55:38
【问题描述】:

大家好,抱歉,如果我是这方面的新手,我已经环顾四周,但还没有完全弄清楚如何去做。基本上我想使用 iphone 的加速度计切换视图。例如,假设 iphone 掉了,这个动作会触发它切换到另一个视图,告诉用户手机掉了。任何有关如何做到这一点的帮助将不胜感激,谢谢。

【问题讨论】:

    标签: iphone objective-c xcode uiview accelerometer


    【解决方案1】:

    可以使用 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      
      }
    }
    

    您可以选择 THRESHOLD 为您想要的任何值。这意味着加速度矢量的长度超过了某个值。我认为如果没有运动,这个值通常在 1 左右,如果有运动,则更高。我建议将其设置为 1.5 之类的东西?您可以自己尝试不同的值。

    希望这会有所帮助!

    【讨论】:

    • 您好,感谢您的帮助,项目构建和运行没有任何问题,但是当加速度计触发并即将更改视图时崩溃。我得到的错误信息是:*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from &lt;FirstViewController: 0x5c42bb0&gt; to &lt;SecondViewController: 0x593d290&gt; while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed 再次感谢,
    • 我不确定我为加载新视图而编写的代码是否正确,也许这就是问题所在? SecondViewController *screen = [[SecondViewController alloc] initWithNibName:nil bundle:nil]; screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentModalViewController:screen animated:YES]; [screen release];
    • 您的代码似乎没问题。您得到的错误是因为您试图在当前转换仍在运行时启动转换。不要忘记,每次您稍微移动您的 iPhone 时,都会调用“accelerometer:didAccelerate”函数。一种解决方案是在 if 语句之后立即执行以下行:self.accelerometer.delegate = nil; 这将防止将来调用该函数。希望这会有所帮助!
    • 啊,我明白了,有道理。完美的!效果很好,非常感谢您的帮助:)
    • 您好,很抱歉再次打扰您,想知道您是否可以再次帮助我。似乎通过阻止函数被调用有它的缺点,因为我不能再次使用加速度计。基本上,当我使用加速度计切换到第二个视图并在之后返回第一个视图时,除非我重建项目,否则加速度计功能将无法再次工作。请帮助解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多