文档章节

iOS-重力感应

麦兜卖鱼丸
 麦兜卖鱼丸
发布于 2016/07/29 09:15
字数 541
阅读 13
收藏 0

前言

对于应用的交互,重力感应的加速器和陀螺仪可以开创一些比较新颖的交互方式,比如使用加速器实现摇一摇功能,使用陀螺仪实现图片跟随设备旋转或者是敲击反应(实现pop back效果)等等;

 

(一)利用cmmotionmanager获取设备的及速度实现摇一摇的功能,再配合上自己设计的业务逻辑,就可以现实市面上很多应用的摇一摇功能了。

#import "MotionViewController.h"
#import <CoreMotion/CoreMotion.h>
#import "FloatTextField.h"

static const double accelerationThreshold = 2.0f;

@interface MotionViewController ()

@property CMMotionManager *motionManager;
@property NSOperationQueue *operationQueue;

@property (nonatomic, strong) UIImageView *image;

@end

@implementation MotionViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    _operationQueue = [[NSOperationQueue alloc] init];
    
    _motionManager = [CMMotionManager new];
    _motionManager.accelerometerUpdateInterval = 1.0f / 60;
    
    
    _image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    _image.center = self.view.center;
    _image.backgroundColor = [UIColor blueColor];
    
    
    [self.view addSubview:_image];
    
    FloatTextField *textfield = [[FloatTextField alloc] initWithFrame:CGRectMake(0, 100, 200, 40)];
    textfield.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:textfield];
}

- (void)viewDidAppear:(BOOL)animated {
    
    [super viewDidAppear:animated];
    [self startAccelermeter];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:UIApplicationDidEnterBackgroundNotification object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:UIApplicationWillEnterForegroundNotification object:nil];
}


- (void)receiveNotification:(NSNotification *)notification {
    
    if ([notification.name isEqualToString:UIApplicationDidEnterBackgroundNotification]) {
        
        [_motionManager stopAccelerometerUpdates];
    } else {
        
        [self startAccelermeter];
    }
}


- (void)startAccelermeter {
    
    [_motionManager startAccelerometerUpdatesToQueue:_operationQueue withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
        
        [self outputaccelerometerData:accelerometerData.acceleration];
    }];
}

- (void)outputaccelerometerData:(CMAcceleration)acceleration {
    
    double accelermeter = sqrt(pow(acceleration.x, 2) + pow(acceleration.y, 2) + pow(acceleration.z, 2));
    if (accelermeter > accelerationThreshold) {
        
        [_motionManager stopAccelerometerUpdates];
        [_operationQueue cancelAllOperations];
        
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            
            [self turnRight];
        }];
    }
}


-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x,
                                   view.bounds.size.height * anchorPoint.y);
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x,
                                   view.bounds.size.height * view.layer.anchorPoint.y);
    
    newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);
    
    CGPoint position = view.layer.position;
    
    position.x -= oldPoint.x;
    position.x += newPoint.x;
    
    position.y -= oldPoint.y;
    position.y += newPoint.y;
    
    view.layer.position = position;
    view.layer.anchorPoint = anchorPoint;
}


- (void)turnRight {
    
    CABasicAnimation *rotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    rotate.fromValue = [NSNumber numberWithFloat:0];
    rotate.toValue = [NSNumber numberWithFloat:M_PI / 3.0];
    rotate.duration = 0.18;
    rotate.repeatCount = 2;
    rotate.autoreverses = YES;
    
    [CATransaction begin];
    [self setAnchorPoint:CGPointMake(-0.2, 0.9) forView:_image];
    [CATransaction setCompletionBlock:^{
        
        [self getData];
    }];
    
    [_image.layer addAnimation:rotate forKey:nil];
    
    [CATransaction commit];
}


- (void)getData {
    
    [self startAccelermeter];
}
@end

解释一下-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view函数,此函数是通过设置的anchorPoint,计算出对应的position,达到不移动的效果。此方法参考至这篇文章

 

总结

以上只是实现了摇一摇的功能,一个简单的效果,其他的更好更复杂功能,大家可以去实践,通过cmmotionmanager获取得到数据,然后通过数据的计算,实现你想要的效果。

© 著作权归作者所有

共有 人打赏支持
麦兜卖鱼丸
粉丝 12
博文 69
码字总数 69333
作品 0
桂林
iOS工程师
私信 提问
IOS摄像头开源代码

要求是可自行调节相机参数,并内嵌于程序内部随意调用: ①可根据开发者需求自行调整焦距,照片预览模式(例如拍摄完成后是否进行自动旋转,或拍摄时关闭重力感应) ②可在调用的同时,由开发...

zhiyong8566
2016/02/23
154
0
将本地特性拓展至HTML5 Web应用

一家名叫AppMobi的小公司,正致力一项工作,使开发者能创建可深入移动设备硬件或操作系统功能的HTML5应用, 如重力感应、加速计、GPS、相机、声音与震动、文件系统等,InfoWorld报道。‘其i...

xyxzfj
2011/11/04
0
0
Unity3D 游戏引擎之平面小球重力感应详解(十三)

Unity3D 游戏引擎之平面小球重力感应详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6969333 手机重力感应应该对大...

彭博
2012/03/09
351
0
将本地特性拓展至 HTML5 Web 应用

一家名叫AppMobi的小公司,正致力一项工作,使开发者能创建可深入移动设备硬件或操作系统功能的HTML5应用, 如重力感应、加速计、GPS、相机、声音与震动、文件系统等,InfoWorld报道。‘其i...

xyxzfj
2011/11/04
1K
5
Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件(十六)

Unity3D 游戏引擎之感应IOS设备旋转与iPhone键盘事件 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6993977 iPhone i...

彭博
2012/03/09
348
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
9
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
5
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部