要使用约束制作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解决方案。
答案 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。