AutoLayout常量更改不动画

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoLayout常量更改不动画相关的知识,希望对你有一定的参考价值。

我想通过修改contentView的顶级约束常量来从底部动画我的contentView。它目前设置为screenBounds.heightcontentView在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为UIView设置动画

AutoLayout 约束动画从错误的点缩放

Autolayout - 使超级视图高度等于子视图高度+常量,其中子视图是 textView

基于Autolayout的动画

Autolayout约束动画化-Animating Autolayout Constraints

以编程方式更改纵横比约束值