动态创建的UIView在碰撞后不会动画

时间:2015-09-14 18:35:21

标签: ios iphone swift animation uiview

感谢阅读这篇文章。

以下是我的计划摘要:

  1. 我动态添加了几个UIViews作为子视图。

  2. 我有移动的物体并碰撞

  3. 当发生碰撞时,我希望其中一个已创建的UIViews淡出,然后我想删除其中一个碰撞的UIViews。

  4. 我可以使用以下内容删除创建的UIView: dynamicAnimator?.referenceView?.viewWithTag(tagOfView)?.removeFromSuperview()

    然而,当我尝试添加动画来淡出视图时,我没有得到任何类型的淡入淡出/动画。我做错了什么?

    UIView.animateWithDuration(1.5, animations: {
        self.dynamicAnimator?.referenceView?.viewWithTag(tagOfView)?.alpha = 0.0 
    })
    

    如果需要,这是整个collisionBehavior()函数。

    func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying, atPoint p: CGPoint) {
        let identOpt : NSCopying? = identifier
    
        if let ident = identOpt as? NSNumber {
            switch ident {
            case Identifiers.paddleAtStartup:
                break
            default:
                ballCollider.removeBoundaryWithIdentifier(ident)
                UIView.animateWithDuration(1.5, animations: {
                    self.dynamicAnimator?.referenceView?.viewWithTag(Int(ident))?.alpha = 0.0
                    })
                dynamicAnimator?.referenceView?.viewWithTag(Int(ident))?.removeFromSuperview()       
            }
        }
    }
    

2 个答案:

答案 0 :(得分:1)

您在碰撞后立即删除视图,并且没有动画效果。你最好在动画的完成处理程序中删除它。

答案 1 :(得分:0)

以下是具有相同问题的任何人的更正代码:

 func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying, atPoint p: CGPoint) {
    let identOpt : NSCopying? = identifier

    if let ident = identOpt as? NSNumber {
        switch ident {
        case Identifiers.paddleAtStartup:
            break
        default:
            UIView.animateWithDuration(0.1, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { ()
                self.dynamicAnimator?.referenceView?.viewWithTag(Int(ident))?.alpha = 0.0
                }, completion: {
                    if $0 {
                        self.dynamicAnimator?.referenceView?.viewWithTag(Int(ident))?.removeFromSuperview()
                        self.ballCollider.removeBoundaryWithIdentifier(ident)
                    }
            })
        }
    }
}