我正在创建一个应用程序,目前它对动作抖动有反应,这是摇动的代码:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
if (event.type == UIEventSubtypeMotionShake) {}
}
现在用户必须真的很难动摇反应,有没有更复杂的方法来检测光波,或者像5次轻微震动然后反应?
答案 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的子类,你可以使用你想要的任何东西。