iOS 晃动手势
2015-07-23 10:50
471 查看
文章链接:/article/7699244.html
让当前的程序 检测手机晃动的方法大体上有两种;第一种方法就是重写UIResponder类下的手势方法(可以用模拟器模拟),第二种方法就是利用Accelerometer来检测手机是否晃动(只能用真机测试)。
第一种方法:
很简单只需三个步骤:让当前ViewController支持晃动手势,让当前的View成为第一响应者,重写UIResponder中支持晃动的3个方法。
1、让当前的ViewController支持晃动;
sample code:
- (void)viewDidLoad
{
[superviewDidLoad];
// 支持shake
[[UIApplicationsharedApplication]setApplicationSupportsShakeToEdit:YES];
}
2、让当前的View成为第一响应者;
sample code:
-(BOOL)canBecomeFirstResponder
{// 默认值是 NO
return YES;
}
-(void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
[selfbecomeFirstResponder];
}
-(void)viewWillDisappear:(BOOL)animated
{
[selfresignFirstResponder];
[superviewWillDisappear:animated];
}
3、重写下面的方法,并在相应的方法中添加手机晃动时需要执行的代码。
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event//开始晃动
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event//晃动结束
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event//取消晃动
第二种方法:
其实根据acceleration判断手机是否晃动,细分又可分为两种,也可认为是一种。
闲话少说直接上代码:
1>使用UIAccelerometer对象检测手机是否晃动(iOS5.0及以后不推荐使用但仍然可以用,只是会有警告提示)
// 创建 UIAccelerometer实例
UIAccelerometer *accelerometer = [UIAccelerometersharedAccelerometer];
accelerometer.updateInterval =0.1;
accelerometer.delegate =self;
// 实现UIAccelerometer实例的代理方法
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{ // iOS5.0 以后不推荐使用
if (fabs(acceleration.x)>2.0 ||fabs(acceleration.y)>2.0 ||fabs(acceleration.z)>2.0)
{
NSLog(@"检测到晃动");
}
}
2>使用CoreMotion框架,根据acceleration值来判断手机是否晃动。(CoreMotion框架是苹果推荐开发者使用的,用来替代UIAccelerometer;最后我会再粘贴一个介绍CoreMotion框架的链接,感觉讲的不错)
使用CMMotionManager来获取accelerometer、gyro、deviceMotion等的信息,有push和pull两种方式,关于这两种方式的优缺点可以在网上查找。
1、push方式获取acceleration数据,以下代码可以放到-(void)viewDidLoad方法中。
CMMotionManager *cmManager = [[CMMotionManageralloc]init];
if (!cmManager.accelerometerAvailable) {
NSLog(@"CMMotionManager unavailable");
}
cmManager.accelerometerUpdateInterval =0.1; // 数据更新时间间隔
[cmManager startAccelerometerUpdatesToQueue:[NSOperationQueuecurrentQueue]withHandler:^(CMAccelerometerData *accelerometerData,NSError *error)
{
double x = accelerometerData.acceleration.x;
double y = accelerometerData.acceleration.y;
double z = accelerometerData.acceleration.z;
if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0)
{
NSLog(@"检测到晃动");
}
NSLog(@"CoreMotionManager, x: %f,y: %f, z: %f",x,y,z);
}];
2、pull方式获取acceletation数据,需要自己实现计时器功能。以下代码可以放到-(void)viewDidLoad方法中。
CMMotionManager *cmManager = [[CMMotionManageralloc]init];
if (!cmManager.accelerometerAvailable) {
NSLog(@"CMMotionManager unavailable");
}
cmManager.accelerometerUpdateInterval =0.1f;
[cmManager startAccelerometerUpdates];
timer = [NSTimerscheduledTimerWithTimeInterval:0.2ftarget:selfselector:@selector(updateAcceleration:)userInfo:nilrepeats:YES];
[timerfire];
自定义方法updateAcceleration:
-(void)updateAcceleration:(id)userInfo
{
CMAccelerometerData *accelData =cmManager.accelerometerData;
double x = accelData.acceleration.x;
double y = accelData.acceleration.y;
double z = accelData.acceleration.z;
if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0)
{
NSLog(@"检测到晃动");
}
}
不管push还是pull方法在最后一定要记得调用CoreMotion实例的 stopAccelerometerUpdates方法([cmManager stopAccelerometerUpdates]),停止CoreMotion实例更新。
OK,可以晃动手机测试测试了^_^…
让当前的程序 检测手机晃动的方法大体上有两种;第一种方法就是重写UIResponder类下的手势方法(可以用模拟器模拟),第二种方法就是利用Accelerometer来检测手机是否晃动(只能用真机测试)。
第一种方法:
很简单只需三个步骤:让当前ViewController支持晃动手势,让当前的View成为第一响应者,重写UIResponder中支持晃动的3个方法。
1、让当前的ViewController支持晃动;
sample code:
- (void)viewDidLoad
{
[superviewDidLoad];
// 支持shake
[[UIApplicationsharedApplication]setApplicationSupportsShakeToEdit:YES];
}
2、让当前的View成为第一响应者;
sample code:
-(BOOL)canBecomeFirstResponder
{// 默认值是 NO
return YES;
}
-(void)viewDidAppear:(BOOL)animated
{
[superviewDidAppear:animated];
[selfbecomeFirstResponder];
}
-(void)viewWillDisappear:(BOOL)animated
{
[selfresignFirstResponder];
[superviewWillDisappear:animated];
}
3、重写下面的方法,并在相应的方法中添加手机晃动时需要执行的代码。
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event//开始晃动
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event//晃动结束
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event//取消晃动
第二种方法:
其实根据acceleration判断手机是否晃动,细分又可分为两种,也可认为是一种。
闲话少说直接上代码:
1>使用UIAccelerometer对象检测手机是否晃动(iOS5.0及以后不推荐使用但仍然可以用,只是会有警告提示)
// 创建 UIAccelerometer实例
UIAccelerometer *accelerometer = [UIAccelerometersharedAccelerometer];
accelerometer.updateInterval =0.1;
accelerometer.delegate =self;
// 实现UIAccelerometer实例的代理方法
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{ // iOS5.0 以后不推荐使用
if (fabs(acceleration.x)>2.0 ||fabs(acceleration.y)>2.0 ||fabs(acceleration.z)>2.0)
{
NSLog(@"检测到晃动");
}
}
2>使用CoreMotion框架,根据acceleration值来判断手机是否晃动。(CoreMotion框架是苹果推荐开发者使用的,用来替代UIAccelerometer;最后我会再粘贴一个介绍CoreMotion框架的链接,感觉讲的不错)
使用CMMotionManager来获取accelerometer、gyro、deviceMotion等的信息,有push和pull两种方式,关于这两种方式的优缺点可以在网上查找。
1、push方式获取acceleration数据,以下代码可以放到-(void)viewDidLoad方法中。
CMMotionManager *cmManager = [[CMMotionManageralloc]init];
if (!cmManager.accelerometerAvailable) {
NSLog(@"CMMotionManager unavailable");
}
cmManager.accelerometerUpdateInterval =0.1; // 数据更新时间间隔
[cmManager startAccelerometerUpdatesToQueue:[NSOperationQueuecurrentQueue]withHandler:^(CMAccelerometerData *accelerometerData,NSError *error)
{
double x = accelerometerData.acceleration.x;
double y = accelerometerData.acceleration.y;
double z = accelerometerData.acceleration.z;
if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0)
{
NSLog(@"检测到晃动");
}
NSLog(@"CoreMotionManager, x: %f,y: %f, z: %f",x,y,z);
}];
2、pull方式获取acceletation数据,需要自己实现计时器功能。以下代码可以放到-(void)viewDidLoad方法中。
CMMotionManager *cmManager = [[CMMotionManageralloc]init];
if (!cmManager.accelerometerAvailable) {
NSLog(@"CMMotionManager unavailable");
}
cmManager.accelerometerUpdateInterval =0.1f;
[cmManager startAccelerometerUpdates];
timer = [NSTimerscheduledTimerWithTimeInterval:0.2ftarget:selfselector:@selector(updateAcceleration:)userInfo:nilrepeats:YES];
[timerfire];
自定义方法updateAcceleration:
-(void)updateAcceleration:(id)userInfo
{
CMAccelerometerData *accelData =cmManager.accelerometerData;
double x = accelData.acceleration.x;
double y = accelData.acceleration.y;
double z = accelData.acceleration.z;
if (fabs(x)>2.0 ||fabs(y)>2.0 ||fabs(z)>2.0)
{
NSLog(@"检测到晃动");
}
}
不管push还是pull方法在最后一定要记得调用CoreMotion实例的 stopAccelerometerUpdates方法([cmManager stopAccelerometerUpdates]),停止CoreMotion实例更新。
OK,可以晃动手机测试测试了^_^…
相关文章推荐
- iOS静态代码分析时常见错误及解决办法
- iOS 7 隐藏特性
- iOS Sprite Kit教程之xcode安装以及苹果帐号绑定
- iOS应用启动时不占满全屏,上下有黑边
- iOS navigationBar颜色
- iOS 7的手势滑动返回
- 正则表达式在iOS中的运用
- iOS Sprite Kit教程之xcode安装以及苹果帐号绑定
- iOS开发,最新判断是否是手机号的正则表达式
- iOS提高开发效率的开源框架整理
- ios的类别(category)和扩展(Extension)
- 干货 IOS设备分辨率一览
- iOS开发-常用第三方开源框架介绍
- iOS核心动画
- iOS开发 ----- 学生管理系统改进版
- 影藏tabbar
- iOS开发学习笔记二 —— Charles
- iOS前期OC训练OC_05省市区数组
- iOS 关于使用xib创建cell的两种初始化方式
- ios8/sdk8/xcode6/iphone6(+)适配