AutoLayout常量更改不动画
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoLayout常量更改不动画相关的知识,希望对你有一定的参考价值。
我想通过修改contentView
的顶级约束常量来从底部动画我的contentView
。它目前设置为screenBounds.height
。
contentView
在superview的底部也有一个底部约束。
以下代码工作正常:
func transition() {
// animate content view up
contentViewTopConstraint.constant = contentViewDestinationY // CGFloat value: 50
UIView.animate(withDuration: 0.6, animations: {
// apply changes
self.view.layoutIfNeeded()
})
}
现在,下面的代码段没有动画(但视图消失了):
@objc func dismissTransition() {
// animate content view down
contentViewYConstraint.constant = screenBounds.height // ~ 834 on regular iPads
UIView.animate(withDuration: 0.6, animations: {
// apply changes
self.view.layoutIfNeeded()
})
}
由于函数代码实际上没有区别,我认为@objc
可能会干扰动画。因为我从dismissTransition()
调用UITapGestureRecognizer
,我需要标签。
我创建了一个包装器:
let tap = UITapGestureRecognizer(target: self, action: #selector(_ dismissTransition))
@objc func dismissTransition() {
dismissTransition()
}
......但这并没有改变任何事情。
我注意到如果我选择比screenBounds.height
更低的值,它会动画:即使用200动画就好了。
这导致我怀疑底部约束干扰动画:
- 我将其优先级设置为750,而最高约束的优先级为1000. - 没有变化。
- 我在
layoutIfNeeded
中调用dismissTransition()
之前尝试停用动画块外部的底部约束。 - 没变。
说实话,我在这里已经没有想法,所以如果有人知道为什么会这样,我会感激任何指导。 谢谢!
PS:Xcode 9,ios 11
Update
我找到了原因:我使用UIView
的扩展来轻松设置如下所示的角半径:
func set(corners: UIRectCorner, radius: CGFloat) {
let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
let mask = CAShapeLayer()
mask.path = path.cgPath
self.layer.mask = mask
}
当评论view.set(corners:radius:)
(我在viewDidLayoutSubviews
内部调用时,在其他地方执行时它无法正常工作),它可以正常动画。
如何更改代码以防止动画?
终于找到了解决方案。 正如我最近对我的帖子所做的更新中所述,我认为这种奇怪行为的原因是一个应该围绕我视角的延伸。 通过使用@belous in this thread提供的以下代码,我能够完成所有工作,是的!
let view = UIView()
view.clipsToBounds = true
view.layer.cornerRadius = 10
view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
以上是关于AutoLayout常量更改不动画的主要内容,如果未能解决你的问题,请参考以下文章
Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView