UIDynamicAnimator в быстром ios 7

В моем приложении для iPad есть одна страница, необходимая для разработки с помощью UIDynamicAnimator. Я добавил часть кода, показанного ниже. Его идеально работает в iOS8 в соответствии с моими потребностями, но не работает на iOS7. Я не получаю повторного вызова делегата при принудительном изменении кадра на подпрыгивание.

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 }

Они глобально распространяются в приложении, как макрос или что-то для лучшей читаемости

Спасибо за поддержку заранее.

1 ответ

Решение

Проблема в этой строке:

self.bounceView.frame = rect

Вы изменяете рамку вида под управлением динамического аниматора, за спиной динамического аниматора. Это незаконно. Я удивлен, что твой код когда-либо работал. Весь смысл динамического аниматора заключается в том, что именно он задает рамку представлений, которыми он управляет.

Чтобы сделать это так, чтобы не заметить динамического аниматора, просто вызовите updateItemUsingCurrentState, Вот для чего это.

Другие вопросы по тегам