为了账号安全,请及时绑定邮箱和手机立即绑定

当有人摇动iPhone时,我该如何检测?

当有人摇动iPhone时,我该如何检测?

iOS
交互式爱情 2019-06-26 15:06:38
当有人摇动iPhone时,我该如何检测?我想在有人摇晃iPhone的时候做出反应。我不在乎他们是如何摇动它的,只是它被有力地挥动了一下。有人知道怎么发现这个吗?
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

在3.0,现在有一个更容易的方法-钩到新的运动事件。

主要的诀窍是,您需要一些UIView(而不是UIViewController)作为FirstResponder来接收抖动事件消息。下面是您可以在任何UIView中使用的代码来获得抖动事件:

@implementation ShakingView- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event{
    if ( event.subtype == UIEventSubtypeMotionShake )
    {
        // Put in code here to handle shake
    }

    if ( [super respondsToSelector:@selector(motionEnded:withEvent:)] )
        [super motionEnded:motion withEvent:event];}- (BOOL)canBecomeFirstResponder{ return YES; }@end

您可以轻松地将任何UIView(甚至系统视图)转换为一个视图,只需使用这些方法对视图进行子类(然后选择此新类型而不是IB中的基类型,或者在分配视图时使用它),就可以简单地获得抖动事件。

在视图控制器中,您希望将此视图设置为第一个响应者:

- (void) viewWillAppear:(BOOL)animated{
    [shakeView becomeFirstResponder];
    [super viewWillAppear:animated];}- (void) viewWillDisappear:(BOOL)animated{
    [shakeView resignFirstResponder];
    [super viewWillDisappear:animated];}

不要忘记,如果您有其他视图成为用户操作的第一个响应者(如搜索栏或文本输入字段),则还需要在其他视图退出时恢复抖动视图第一响应状态!

即使将application ationSupportsShakeToEdit设置为no,此方法也有效。


查看完整回答
反对 回复 2019-06-26
?
白衣非少年

TA贡献1155条经验 获得超0个赞

从我的狄沙克申请:

// Ensures the shake is strong enough on at least two axes before declaring it a shake.// "Strong enough" means "greater than a client-supplied threshold" in G's.static BOOL L0AccelerationIsShaking(UIAcceleration* last, UIAcceleration* current, double threshold) {
    double
        deltaX = fabs(last.x - current.x),
        deltaY = fabs(last.y - current.y),
        deltaZ = fabs(last.z - current.z);

    return
        (deltaX > threshold && deltaY > threshold) ||
        (deltaX > threshold && deltaZ > threshold) ||
        (deltaY > threshold && deltaZ > threshold);}@interface L0AppDelegate : NSObject <UIApplicationDelegate> {
    BOOL histeresisExcited;
    UIAcceleration* lastAcceleration;}@property(retain) UIAcceleration* lastAcceleration;@end@implementation L0AppDelegate- (void)applicationDidFinishLaunching:(UIApplication *)application {
    [UIAccelerometer sharedAccelerometer].delegate = self;}- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

    if (self.lastAcceleration) {
        if (!histeresisExcited && L0AccelerationIsShaking(self.lastAcceleration, acceleration, 0.7)) {
            histeresisExcited = YES;

            /* SHAKE DETECTED. DO HERE WHAT YOU WANT. */

        } else if (histeresisExcited && !L0AccelerationIsShaking(self.lastAcceleration, acceleration, 0.2)) {
            histeresisExcited = NO;
        }
    }

    self.lastAcceleration = acceleration;}// and proper @synthesize and -dealloc boilerplate code@end

计量学防止抖动事件多次触发,直到用户停止抖动。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 567 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信