swift 加速传感器
2017-01-04 19:41
267 查看
加速传感器以前用的UIAccelerometer实现,但是Xcode6后完全放弃了,使用CoreMotion代替它能监听到x,y,z三个方向的加速度,听起来比较炫,实际上使用方法很简单,具体使用步骤如下:
1、实例化CMMotionManager类
2、向CMMotionManager的accelerometerUpdateInterval属性中设置通知间隔时间值。
3、使用NSOperationQueue.currentQueue()建立一个监听队列
4、使用startAccelerometerUpdatesToQueue 方法更新监听队列,并设置回调函数用于接受加速度通知,通知时间间隔已经在第二步设置过。在回调函数中使用accelerometerData.acceleration 相关属性可以获得x,y,z各方向的加速度。
import UIKit
import CoreMotion
class ViewController: UIViewController{
var ball:UIImageView!
// 设备x轴的加速值
var spendX:UIAccelerationValue = 0
// 设备x轴的加速值
var spendY:UIAccelerationValue = 0
var motionManager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
ball = UIImageView.init(image: UIImage(named:"1"))
ball.frame = CGRect.init(x: 0, y: 0, width: 50, height: 50)
ball.center = self.view.center
self.view.addSubview(ball)
// 告诉motionManager更新的频率
motionManager.accelerometerUpdateInterval = 1/60
//判断加速器是否可用
if motionManager.isAccelerometerAvailable {
let queue = OperationQueue.current
// 开始更新,后台线程运行
motionManager.startAccelerometerUpdates(to: queue!, withHandler: {
(CMAccelerometerData,NSError) in
//动态设置小球位置
self.spendX += (CMAccelerometerData?.acceleration.x)!
self.spendY += (CMAccelerometerData?.acceleration.y)!
var posX = (self.ball.center.x) + CGFloat((self.spendX))
var posY = (self.ball.center.y) - CGFloat((self.spendY))
//碰到边框后的反弹处理
if posX < 0{
posX = 0
//碰到左边的边框后以0.4倍的速度反弹
self.spendX *= -0.4
} else if posX > (self.view.frame.size.width) {
posX = (self.view.frame.size.width)
//碰到右边的边框有以0.4倍的速度反弹
self.spendX *= -0.4
}
if posY < 0{
posY = 0
//碰到上面的边框不反弹
self.spendY = 0
} else if posY > (self.view.bounds.size.height){
posY = (self.view.frame.size.height)
//碰到下面的边框以1.5倍的速度反弹
self.spendY *= -1.5
}
self.ball.center = CGPoint.init(x: posX, y: posY)
})
}
}
}
1、实例化CMMotionManager类
2、向CMMotionManager的accelerometerUpdateInterval属性中设置通知间隔时间值。
3、使用NSOperationQueue.currentQueue()建立一个监听队列
4、使用startAccelerometerUpdatesToQueue 方法更新监听队列,并设置回调函数用于接受加速度通知,通知时间间隔已经在第二步设置过。在回调函数中使用accelerometerData.acceleration 相关属性可以获得x,y,z各方向的加速度。
import UIKit
import CoreMotion
class ViewController: UIViewController{
var ball:UIImageView!
// 设备x轴的加速值
var spendX:UIAccelerationValue = 0
// 设备x轴的加速值
var spendY:UIAccelerationValue = 0
var motionManager = CMMotionManager()
override func viewDidLoad() {
super.viewDidLoad()
ball = UIImageView.init(image: UIImage(named:"1"))
ball.frame = CGRect.init(x: 0, y: 0, width: 50, height: 50)
ball.center = self.view.center
self.view.addSubview(ball)
// 告诉motionManager更新的频率
motionManager.accelerometerUpdateInterval = 1/60
//判断加速器是否可用
if motionManager.isAccelerometerAvailable {
let queue = OperationQueue.current
// 开始更新,后台线程运行
motionManager.startAccelerometerUpdates(to: queue!, withHandler: {
(CMAccelerometerData,NSError) in
//动态设置小球位置
self.spendX += (CMAccelerometerData?.acceleration.x)!
self.spendY += (CMAccelerometerData?.acceleration.y)!
var posX = (self.ball.center.x) + CGFloat((self.spendX))
var posY = (self.ball.center.y) - CGFloat((self.spendY))
//碰到边框后的反弹处理
if posX < 0{
posX = 0
//碰到左边的边框后以0.4倍的速度反弹
self.spendX *= -0.4
} else if posX > (self.view.frame.size.width) {
posX = (self.view.frame.size.width)
//碰到右边的边框有以0.4倍的速度反弹
self.spendX *= -0.4
}
if posY < 0{
posY = 0
//碰到上面的边框不反弹
self.spendY = 0
} else if posY > (self.view.bounds.size.height){
posY = (self.view.frame.size.height)
//碰到下面的边框以1.5倍的速度反弹
self.spendY *= -1.5
}
self.ball.center = CGPoint.init(x: posX, y: posY)
})
}
}
}
相关文章推荐
- Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
- Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
- 加速传感器(CoreMotion) swift
- iOS Swift 自定义tabbar
- Swift类和结构体(Classes and Structures)
- iOS学习笔记47-Swift(七)泛型
- swift 中的?和!
- Swift 类
- Swift开发笔记4.协议Protocal
- 6、Swift元组的使用
- Swift - 使用arc4random()、arc4random_uniform()取得随机数
- Swift3.0语言教程字符串转换为数字值
- iOS OC与Swift 项目调试神器
- Swift函数式编程:Optional
- swift手记-trie自动机
- swift中的&-备
- Swift3.0 UIImage设置圆角无效
- Swift - 自动布局库SnapKit的使用详解(配置、使用方法、样例)
- swift init继承问题
- Swift-导航控制器UINavigationController的用法示例