8

I have a ViewController that has been configured in InterfaceBuilder to use AutoLayout for all of its subviews. Layout is working fine.

I want to make one of the subviews bounce using the cool gravity effects provided by UIDynamicAnimator. I didn't think that would work with AutoLayout, but I tried it and it does. It works quite well!

My question is, is this the expected behavior? Is it going to cause problems somewhere? Does Apple provide any guidance around combining AutoLayout and UIDynamicAnimators?

Here is the code, for anyone interested:

    var boundaryFrame = self.buttonBackgroundView.frame
    boundaryFrame = CGRect(x: 0,
        y: boundaryFrame.origin.y + (boundaryFrame.height + 1),
        width: self.view.frame.width,
        height: 2)

    self.animator = UIDynamicAnimator(referenceView: self.view)
    var gravity = UIGravityBehavior(items: [self.buttonBackgroundView])
    gravity.magnitude = 0.5

    var collision = UICollisionBehavior(items: [self.buttonBackgroundView])
    var boundaryId: NSMutableString = NSMutableString(string: "bottomBoundary")
    let boundaryPath = UIBezierPath(rect: boundaryFrame)
    collision.addBoundaryWithIdentifier(boundaryId, forPath: boundaryPath)

    let bounceProperties = UIDynamicItemBehavior(items: [self.buttonBackgroundView])
    bounceProperties.elasticity = 0.5

    // Move it up before causing it to bounce down to its original location
    self.setMeUpTopConstraint.constant = 10
    self.view.setNeedsUpdateConstraints()
    self.view.layoutIfNeeded()

    // Start animating
    animator.addBehavior(gravity)
    animator.addBehavior(collision)
    animator.addBehavior(bounceProperties)
4

2 回答 2

6

我的问题是,这是预期的行为吗?它会在某个地方引起问题吗?Apple 是否提供有关结合 AutoLayout 和 UIDynamicAnimators 的任何指导?

基本上,UIKit Dynamics不能很好地配合自动布局。基本上规则是改变框架/中心与自动布局相反——这正是 UIKit Dynamics 所做的。您没有遇到问题的唯一原因是,布局碰巧不会发生在您正在制作动画的视图上。

测试方法是这样的。运行您的代码,然后(当动画完成时;可能您需要使用延迟性能)运行

self.view.layoutIfNeeded

这会导致布局发生。如果在那一刻事情发生了变化,那就暴露了问题。

于 2015-02-12T02:59:18.700 回答
0

是的,UIDynamicAnimator 与 AutoLayout 配合得很好。我有一个严重依赖 UIDynamicAnimator 并使用约束的应用程序,它运行良好。我发现的唯一问题是 UIView animateWithDuration 不适用于约束,但该方法无论如何都不适用于 UIDynamicAnimator。希望能帮助到你 :)

于 2015-02-12T02:04:05.347 回答