2014-11-21 81 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