老大这两天新出一个需求,不要以前的按钮控制硬件设备,说是太老土了。。。。要求通过手势和传感器来控制设备的移动方向,于是我就了解了下,代码很简单,贴下代码。
#import <CoreMotion/CoreMotion.h>
static double MIN_LIMIT = 0.3;
static double MAX_LIMIT = 1.0;
@interface ViewController ()
@property (nonatomic, strong) CMMotionManager *motionManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 添加上下左右四个方向的轻扫手势
{
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
recognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:recognizer];
}
{
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
recognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:recognizer];
}
{
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
recognizer.direction = UISwipeGestureRecognizerDirectionUp;
[self.view addGestureRecognizer:recognizer];
}
{
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
recognizer.direction = UISwipeGestureRecognizerDirectionDown;
[self.view addGestureRecognizer:recognizer];
}
// 开始加速器
[self accelerometerPush];
// 结束加速器
// [self stopAccelerometer];
}
- (void)handleSwipe:(UISwipeGestureRecognizer *)recognizer {
// Swipe手势的State只有一种End状态,没有开始状态
switch (recognizer.direction) {
case UISwipeGestureRecognizerDirectionRight: {
NSLog(@"向右轻扫");
break;
}
case UISwipeGestureRecognizerDirectionLeft: {
NSLog(@"向左轻扫");
break;
}
case UISwipeGestureRecognizerDirectionUp: {
NSLog(@"向上轻扫");
break;
}
case UISwipeGestureRecognizerDirectionDown: {
NSLog(@"向下轻扫");
break;
}
}
}
- (void)accelerometerPush {
self.motionManager = [[CMMotionManager alloc] init];
if (![self.motionManager isAccelerometerAvailable]) {
NSLog(@"加速计不可用");
return;
}
// 更新频率
self.motionManager.accelerometerUpdateInterval = 0.1;
[self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
NSLog(@"%f \\\\\\\\\\\\ %f \\\\\\\\\\\\ %f",accelerometerData.acceleration.x,accelerometerData.acceleration.y,accelerometerData.acceleration.z);
// 保留两位小数,舍弃后面所有位数
double x = floor(accelerometerData.acceleration.x * 100) / 100;
double y = floor(accelerometerData.acceleration.y * 100) / 100;
double z = floor(accelerometerData.acceleration.z * 100) / 100;
/**
前后方向对应是y轴,向后y为负,向前y为正
左右方向对应是x轴,向左x为负,向右x为正
上下方向对应是z轴,向上z为负,向下z为正
*/
if (y <= -MIN_LIMIT && y >= -MAX_LIMIT &&
z <= -MIN_LIMIT && z >= -MAX_LIMIT) {
NSLog(@"向后倾斜");
}else if (y >= MIN_LIMIT && y <= MAX_LIMIT &&
z <= -MIN_LIMIT && z >= -MAX_LIMIT) {
NSLog(@"向前倾斜");
}else if (x <= -MIN_LIMIT && x >= -MAX_LIMIT &&
z <= -MIN_LIMIT && z >= -MAX_LIMIT) {
NSLog(@"向左倾斜");
}else if (x >= MIN_LIMIT && x <= MAX_LIMIT &&
z <= -MIN_LIMIT && z >= -MAX_LIMIT) {
NSLog(@"向右倾斜");
}else {
NSLog(@"结束倾斜");
}
}];
}
- (void)stopAccelerometer {
[self.motionManager stopAccelerometerUpdates];
}