2014-11-21 73 views
-1

我的iPad應用程序有一個頁面需要使用UIDynamicAnimator進行開發。我在下面添加了一段代碼。它根據我的需要在iOS8中完美工作,但在iOS7上失敗。當強制更改框架彈跳時,我不會重複呼叫委託。UIDynamicAnimator in swift ios 7

private var bounceCount:Int = 0 
private var animator:UIDynamicAnimator! 
private var animateWithBounce:Bool = Yes 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

// Do any additional setup. 
if(self.animateWithBounce==Yes) { 

self.hideAnimationViews() 

var rect:CGRect = self.bounceView.frame 
rect.origin.y = 319 
self.bounceView.frame = rect 
self.bounceCount = 0 

var animator:UIDynamicAnimator = UIDynamicAnimator(referenceView: self.bounceContainerView) 

var gravityBehavior:UIGravityBehavior = UIGravityBehavior(items: [self.bounceView]) 
gravityBehavior.gravityDirection = CGVector(dx: 0.0, dy: -1.0) 
gravityBehavior.magnitude = 1.0 
animator.addBehavior(gravityBehavior) 

var collisionBehavior:UICollisionBehavior = UICollisionBehavior(items: [self.bounceView]) 
collisionBehavior.translatesReferenceBoundsIntoBoundary = Yes; 
collisionBehavior.collisionDelegate = self; 
animator.addBehavior(collisionBehavior) 

var elasticityBehavior:UIDynamicItemBehavior = UIDynamicItemBehavior(items: [self.bounceView]) 
elasticityBehavior.elasticity = 0.8; 
animator.addBehavior(elasticityBehavior) 

self.animator = animator 
    } 
} 

// MARK: - UICollisionBehaviorDelegate methods 

func collisionBehavior(behavior: UICollisionBehavior, endedContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying) { 
    var rect:CGRect = self.bounceView.frame 

    if(self.bounceCount==0) { 
     rect.origin.y = 79.25 
    } 
    else if(self.bounceCount==1) { 
     rect.origin.y = 19.25 
    } 
    else if(self.bounceCount==2) { 
     rect.origin.y = 09.25 
    } 
    else if(self.bounceCount==3) { 
     self.startAnimationOnViews() 
    } 

    self.bounceView.frame = rect 

    bounceCount = bounceCount+1 
} 

// MARK: - 

private func hideAnimationViews() 
{ 
//some views hided here 
} 

private func startAnimationOnViews() 
{ 
UIView.animateKeyframesWithDuration(duration, delay: delay, options: options, animations: { 

UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: time1, animations: { 
//some views showing on first time slot 
}) 

UIView.addKeyframeWithRelativeStartTime(time1, relativeDuration: time2, animations: { 
//some views showing on second time slot 
}) 

}, completion: {finished in 
//recursive call 
}) 
} 

我正在使用XCode 6.1.0,與iOS7的應用程序兼容性。基地SDK的iOS 8.1

var Yes:Bool { return true } 
var No:Bool { return false } 

這些像宏或一些應用在全球範圍內共享以提高可讀性

感謝支持提前。

+0

你的代碼看起來很好(顯然)。你能否展示失敗的部分? – matt 2014-11-21 13:53:20

+0

故障部件位於collisionDelegate。我根據自己的需要多次改變了視圖的框架。代表不在使用ios7快速調用。 :(但與ios8很好,希望你有我的問題,謝謝你... – imalvare 2014-11-21 14:12:09

+1

好的,我會再說一遍_Show實際的代碼,你認爲是失敗._我願意複製,粘貼和測試你的代碼適合你,但是我不會從頭開始編寫我自己的代碼,只是爲了幫助你。 – matt 2014-11-21 14:17:49

回答

3

的問題是這一行:

self.bounceView.frame = rect 

您的動態動畫的控制下改變視圖的幀,動態動畫師的背後。這是非法的。我很驚訝你的代碼有史以來工作。動態動畫設計師的整個觀點是,它是設置它所控制的視圖的框架的那個人。

要做到這一點,不能逃避動態動畫製作者的注意,只需撥打updateItemUsingCurrentState即可。這就是它的目的。

+0

好了,我明白了你的觀點。非常感謝你的耐心和你給我的時間。我將以動畫師處理與視圖相關的所有內容的方式更改代碼。 – imalvare 2014-11-21 15:08:24

+0

對此我很抱歉,但這裏的原始問題陳述真的讓我很生氣:「我沒有從動畫師的UICollisionBehavior獲得任何委託。」 「iOS7支持UIDynamicAnimator嗎?」代表_is_被調用。它只是不如你所希望的那樣工作 - 因爲你所做的是錯誤的。這種責怪系統的傾向(哦,Swift不支持UIDynamicAnimator)而不是你自己太普遍。沒有人知道編譯器/運行庫比你知道的更多,沒有人可以學習編程。對不起,我現在要脫掉我的肥皂盒。 – matt 2014-11-21 15:08:33

+0

此外,UIKit Dynamics不應該以這種方式使用。您不會告訴物品應該彈起多少次。相反,你可以操縱物品的彈性,重力等。考慮你的物品就像真實世界的物品。當你放下球時,球是否會彈回3次?不,彈跳的次數取決於你放球的高度,球的初始速度,彈性和地面的彈性。 – 2014-11-21 15:17:17