swift 3 layoutIfneeded无法正常工作

时间:2016-10-19 12:55:31

标签: ios animation uiview swift3 uiviewanimation

要使用约束制作uiview的正确动画,你必须设置新约束值,然后调用View.layoutIfNeeded(), for swift 3 这不起作用,而不是从视图中调用&#39 ; s约束被改变了。它必须从上面的视图中调用,如下所示:self.view.layoutIfNeeded()。 例如:

UIView.animate(withDuration: 0.1,
               delay: 0.1,
               options: UIViewAnimationOptions.curveEaseIn,
               animations: { () -> Void in
                   constraintHeight.constant = 10.00
                   // instead of myView.layoutIfNeeded() // Swift 2
                   self.view.layoutIfNeeded() // Swift 3
    }, completion: { (finished) -> Void in
    // ....
})

问题是,在我的情况下,我做了改变,我使用这个动画的方式是底视图(底部栏/横幅视图),当滚动桌面视图时隐藏,并在一直走到在tableview中排名第一。既然我已经使用self.view.layoutIfNeeded()改变了swift 3的正确代码,那么当你向下滚动并查看tableview时,tableview会变得很奇怪,速度变慢,行开始显示为淡入或者呈现的速度很慢39; s部分以慢动作跳跃或移动,似乎记忆从80mb上升到100mb。如果我消除了代码中的行,我没有得到动画,视图只是出现并消失了滚动的tableview,但是......我没有得到奇怪的行为。我还检查了视图层次结构,以检查是否创建了wierd 100个视图复制或什么..任何关于我如何解决这个问题的提示。所有这些只是在swift 2中使用View.layoutIfneeded()正常工作但现在调用正在上层视图中进行.. omg..wierd act

问题来自Swift 3 UIView animation解决方案。

3 个答案:

答案 0 :(得分:3)

尝试此操作以强制布局更改为superview

//Force to complete all changes.
self.view.superview.layoutIfNeeded()

//Update constant
constraintHeight.constant = 10.00

UIView.animate(withDuration: 0.1,
               delay: 0.1,
               options: UIViewAnimationOptions.curveEaseIn,
               animations: { () -> Void in
                   self.view.superview.layoutIfNeeded()
    }, completion: { (finished) -> Void in
    // ....
})

答案 1 :(得分:1)

UIView.animate(withDuration: 0.5, delay: 0.3, options: [.repeat, .curveEaseOut, .autoreverse], animations: {
   // perform your animation here .
    self.username.center.x += self.view.bounds.width
    self.view.layoutIfNeeded()
}, completion: nil)

答案 2 :(得分:1)

解决我的需求。谢谢大家分享你的答案!

我的视图层次结构

- root view
   - uitableView
   - bottomBarView
   - bottomBannerView

由于该层次结构,我不能使用self.view.layoutIfNeeded()或self.bottomBarView.superview?.layoutIfneeded(),因为它正在调用布局相同的superview,它也承载tableview并为其触发此函数如果滚动超过10,并且如果它更少..所以它总是扼杀layoufIfneeded方法。我必须从头开始做我想的。

正确的方法是创建一个托管底部视图和横幅视图的容器视图,将其约束到根超级视图的底部,并将bottomBarView和bottomBannerView约束到IT。

现在查看层次结构。

-root view
  -uitableView
      -containerBottomView
           -bottomBarView
           -bottomBannerView

这样我可以调用self.bottomBarView.superview?.layoutIfNeeded(),它不会触发也承载uitableview的根视图。它正确触发布局containerBottomView。