文档章节

iOS-重力感应

麦兜卖鱼丸
 麦兜卖鱼丸
发布于 2016/07/29 09:15
字数 541
阅读 12
收藏 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工程师
私信 提问
将本地特性拓展至HTML5 Web应用

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

xyxzfj
2011/11/04
0
0
iOS Sprite Kit教程之申请和下载证书

iOS Sprite Kit教程之申请和下载证书 模拟器虽然可以实现真机上的一些功能,但是它是有局限的。例如,在模拟器上没有重力感应、相机机等。如果想要进行此方面的游戏的开发,进行程序测试时,...

大学霸
2015/07/24
0
0
iOS11 instrument和真机测试的新玩法--无线调试模式(connect via network)

1.真机调试问题 做iOS开发的同学们都晓得instrument这个开发者工具的神奇之处,好处自然不会多说,下面就说说iOS11 中instrument真机测试时的新玩法.想必做过重力感应,蓝牙,无线连接,地图定位的...

贝勒老爷
08/10
0
0
Cocos2d-JS加速度计与加速度事件

在很多移动设备的游戏使用到了加速度计,Cocos2d-JS引擎提供了访问加速度计传感器的能力。本节我们首先介绍一下加速度计传感器,然后再介绍如何在Cocos2d-JS中访问加速度计。 加速度计 加速度...

智捷课堂
2015/04/03
0
0
4 款佛系休闲小游戏-安卓&iOS

前言 分享 4 款佛系休闲小游戏,无聊时打发打发时间~ Hello Stars 安卓 & iOS 我们需要通过划线来引导小球到达指定地点,使其接触关卡中的所有星星,或完成指定场景任务。 游戏中的物体受重力...

己立
08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 源代码和 C 源代码的运行区别

与其他程序的执行方式和编译方式不同。 Java 源代码需要进行编译成字节码后在 Java 虚拟机上运行,这样 Java 程序能够保持独立性和跨平台功特性。 请参考下图。 https://www.cwiki.us/pages...

honeymose
47分钟前
3
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
今天
5
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
6
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
5
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部