对象停止移动 - UIDynamics 和 Swift iOS
Objects stop moving - UIDynamics and Swift iOS
我正在尝试为一组按钮添加引力,以便它们在设备倾斜时在屏幕上移动。物体会移动,只要设备始终处于运动状态,它们就会一直移动,但是一旦设备静止至少 1 秒,它们就会完全停止移动,即使我在那之后移动设备,它们也会粘在边缘上。
这是我的代码:
在ViewController.Swift
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
var motionManager = CMMotionManager()
var motionQueue = NSOperationQueue()
let itemBehavior = UIDynamicItemBehavior()
这两个调用 int he ViewDidLoad()
func addBehaviours (){
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [emailButton,facebookButton])
animator.addBehavior(gravity)
itemBehavior.friction = 0.1;
itemBehavior.elasticity = 0.5
animator?.addBehavior(itemBehavior)
collision = UICollisionBehavior(items: [emailButton, facebookButton])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
itemBehavior.addItem(emailButton)
itemBehavior.addItem(facebookButton)
}
func updateMotion () {
motionManager.startDeviceMotionUpdatesToQueue(motionQueue) { (motion: CMDeviceMotion?, error: NSError?) -> Void in
self.gravity.gravityDirection = CGVectorMake(CGFloat((motion?.gravity.x)!), -CGFloat((motion?.gravity.y)!))
}
}
首先,通过将运动管理器的 deviceMotionUpdateInterval
设置为 0.2
之类的值(即比动画师的帧速率低得多)来降低更新速率。然后,更改此行:
motionManager.startDeviceMotionUpdatesToQueue(motionQueue) { // ...
对此:
motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { // ...
您计划在处理程序中执行的所有操作都涉及与动画师或其盟友交谈(即重力行为),并且需要在主线程上完成。因此,像您现在所做的那样,在后台队列上接收更新是没有意义的,因为无论如何您都需要立即进入主线程。
我正在尝试为一组按钮添加引力,以便它们在设备倾斜时在屏幕上移动。物体会移动,只要设备始终处于运动状态,它们就会一直移动,但是一旦设备静止至少 1 秒,它们就会完全停止移动,即使我在那之后移动设备,它们也会粘在边缘上。
这是我的代码:
在ViewController.Swift
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!
var motionManager = CMMotionManager()
var motionQueue = NSOperationQueue()
let itemBehavior = UIDynamicItemBehavior()
这两个调用 int he ViewDidLoad()
func addBehaviours (){
animator = UIDynamicAnimator(referenceView: view)
gravity = UIGravityBehavior(items: [emailButton,facebookButton])
animator.addBehavior(gravity)
itemBehavior.friction = 0.1;
itemBehavior.elasticity = 0.5
animator?.addBehavior(itemBehavior)
collision = UICollisionBehavior(items: [emailButton, facebookButton])
collision.translatesReferenceBoundsIntoBoundary = true
animator.addBehavior(collision)
itemBehavior.addItem(emailButton)
itemBehavior.addItem(facebookButton)
}
func updateMotion () {
motionManager.startDeviceMotionUpdatesToQueue(motionQueue) { (motion: CMDeviceMotion?, error: NSError?) -> Void in
self.gravity.gravityDirection = CGVectorMake(CGFloat((motion?.gravity.x)!), -CGFloat((motion?.gravity.y)!))
}
}
首先,通过将运动管理器的 deviceMotionUpdateInterval
设置为 0.2
之类的值(即比动画师的帧速率低得多)来降低更新速率。然后,更改此行:
motionManager.startDeviceMotionUpdatesToQueue(motionQueue) { // ...
对此:
motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { // ...
您计划在处理程序中执行的所有操作都涉及与动画师或其盟友交谈(即重力行为),并且需要在主线程上完成。因此,像您现在所做的那样,在后台队列上接收更新是没有意义的,因为无论如何您都需要立即进入主线程。