物体停止移动 - UIDynamics和Swift iOS

时间:2016-01-26 23:03:24

标签: ios swift gravity motion uikit-dynamics

我正在尝试将重力添加到一组按钮,以便在设备倾斜时它们在屏幕上移动。物体移动,只要设备始终处于运动状态,它们就会继续移动,但是一旦设备静止至少1秒钟,它们就会完全停止移动,即使我在此之后移动设备也会粘在边缘上。 p>

这是我的代码:

在ViewController.Swift

var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!
var collision: UICollisionBehavior!


var motionManager = CMMotionManager()
var motionQueue = NSOperationQueue()
let itemBehavior = UIDynamicItemBehavior()

这两个在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)!))


    }

}

1 个答案:

答案 0 :(得分:1)

首先,通过将动画管理器的deviceMotionUpdateInterval设置为类似0.2的内容来降低更新速率(即,比动画制作者的帧速率低得多)。然后,更改此行:

motionManager.startDeviceMotionUpdatesToQueue(motionQueue) { // ...

到此:

motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.mainQueue()) { // ...

您计划在处理程序中执行的所有操作都涉及与动画师或其盟友交谈(即重力行为),并且需要在主线程上完成。因此,无需像现在一样在后台队列上接收更新,因为无论如何都需要立即进入主线程。