如何检测iPhone中的轻微运动抖动?

时间:2012-08-03 10:24:12

标签: iphone objective-c ios xcode motion

我正在创建一个应用程序,目前它对动作抖动有反应,这是摇动的代码:

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
  {
      if (event.type == UIEventSubtypeMotionShake) {}
  }

现在用户必须真的很难动摇反应,有没有更复杂的方法来检测光波,或者像5次轻微震动然后反应?

1 个答案:

答案 0 :(得分:1)

尝试以下

在您的文件中.h

#import <UIKit/UIKit.h>

@interface ShakeUIView : UIView <UIAccelerometerDelegate>{
    BOOL hasBeenShaken;
    UIAcceleration* lastAction;
    id delegate;
}

@property(strong) UIAcceleration* lastAction;
@property (nonatomic, assign) id delegate;

@end

在您的文件中.m

#import "ShakeUIView.h"

@implementation ShakeUIView

@synthesize lastAction;

// adjust the threshold to increase/decrease the required amount of shake
static BOOL SJHShaking(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);
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
            }
    return self;
}

-(void)awakeFromNib{
    [super awakeFromNib];
    [UIAccelerometer sharedAccelerometer].delegate = self;
}

- (void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

    if (self.lastAction) {
        if (!hasBeenShaken && SJHShaking(self.lastAction, acceleration, 0.7)) { 
            hasBeenShaken = YES;
            // Shake detacted do what you want here

        } else if (hasBeenShaken && !SJHShaking(self.lastAction, acceleration, 0.2)) {
            hasBeenShaken = NO;
        }
    }

    self.lastAction = acceleration;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

-(void)dealloc{
    [UIAccelerometer sharedAccelerometer].delegate = nil;
}

我使用了UIView的子类,你可以使用你想要的任何东西。

相关问题