2016-01-26 50 views
0

我想向一組按鈕添加重力,以便在設備傾斜時它們圍繞屏幕移動。物體會移動,只要設備始終處於運動狀態,它們就會繼續移動,但一旦設備至少停留1秒鐘,設備就會完全停止移動,並且即使在此之後移動設備,也會粘住邊緣。對象停止移動 - UIDynamics和Swift iOS

這裏是我的代碼:

在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)!)) 


    } 

} 
+0

@matt我看過那個問題,沒有答案。我可以降低方向改變的速度,但我看了一個在線教程,它在那裏工作得很好。我測試過,動畫製作者停止在那個停止移動的位置,但在那之後繼續運行。 –

+0

@matt我剛剛給了它,並沒有奏效。我也嘗試重新啓動動畫師,但無法找到一種方法來做到這一點。我也注意到,即使設備是平坦的並且不移動,也會發生這種情況。它只有一次動畫製作者停止了,之後不再有效 –

回答

1

首先,通過設置減少更新的速度運動管理器的deviceMotionUpdateInterval類似於0.2(即,比動畫製作者的幀頻少得多)。然後,改變這一行:

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

這樣:

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

一切你計劃在你的處理器做涉及談話的動畫製作人或盟國(即重力行爲),而需求在主線程上完成。所以沒有必要在後臺隊列上接收更新,因爲您現在需要馬上進入主線程。