当前位置: 首页 > 知识库问答 >
问题:

如何使用约束自底向上动画UIView?

韩鸿波
2023-03-14

我正在以编程方式创建UIView,之后我将使用约束从下到上设置该视图的动画。但动画不会显示在此视图对象上。

        overlay!.addSubview(contentView)
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.leadingAnchor.constraint(equalTo: vc.view.leadingAnchor, constant: 20).isActive = true
        contentView.trailingAnchor.constraint(equalTo: vc.view.trailingAnchor, constant: -20).isActive = true

        contentView.addSubview(messageLabel)
        messageLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 8).isActive = true
        messageLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -8).isActive = true
        messageLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8).isActive = true
        messageLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8).isActive = true

        let width: CGFloat = vc.view.frame.width - 40 - 16
        stringHeight = calculateEstimatedHeight(width: width, text: text) + 16
        contentView.heightAnchor.constraint(equalToConstant: stringHeight).isActive = true

        bottomConstraint = contentView.bottomAnchor.constraint(equalTo: vc.view.bottomAnchor, constant: stringHeight)
        bottomConstraint.isActive = true

        DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
            self.showToastViewWithAnimation(viewController: vc)
        }


@objc func showToastViewWithAnimation(viewController: Any) {
        if let vc = viewController as? ViewController {

            vc.view.layoutIfNeeded()

            UIView.animate(withDuration: 0.8) {
                self.bottomConstraint.constant = -20
                vc.view.layoutIfNeeded()
            }
        }
    }

共有2个答案

洪建茗
2023-03-14

在代码中添加此行:

self.translatesAutoresizingMaskIntoConstraints = false
contentView.translatesAutoresizingMaskIntoConstraints = false

在你的ShowToastView函数中,首先找到哪个是底部约束,然后尝试这样更新它(记住它是一个提示代码,你可以根据你的要求更新它):

@objc func showToastViewWithAnimation(viewController: Any) {
    if let vc = viewController as? ViewController {
        if let bottom = self.contentView.superview?.constraints.first(where: { (constraint) -> Bool in
        return constraint.firstAttribute == .bottom}){ 
// in this condition find your bottom constraint and update it, don't save your constraint in a variable.
           bottom.constant = -20 
           UIView.animate(withDuration: 0.8, animations: {               
             vc.view.layoutIfNeeded()
           }) { (complete) in

           }
        }
    }
}
养学
2023-03-14

我通过评论指出了一些事情,阅读评论,您将了解代码中的问题,请查看下面的代码。

=

   @objc func showToastViewWithAnimation(viewController: Any) {
            if let vc = viewController as? ViewController {
                //vc.view.layoutIfNeeded() - this is not required before updating constraint value
                self.bottomConstraint.constant = -20 //update contstraint outside of the animation block
                UIView.animate(withDuration: 0.8) {                
                    //vc.view.layoutIfNeeded() 
                    self.overlay?.layoutIfNeeded() //you needs to layout the overlay view, as your other toast views are added in overlay view and not in view of viewcontroller as per your code
                }
            }
        }
 类似资料:
  • 我正在用更新一个旧的应用程序,当没有广告时,它就会滑出屏幕。当有广告时,它会在屏幕上滑动。基本的东西。 老风格,我设置了一个动画块的框架。新样式中,我有一个到auto-layout约束,它确定位置,在本例中是距离超级视图底部的距离,并修改常数: 和预期的一样,但没有动画。 更新:我重新观看了WWDC12讨论的最佳实践,以掌握自动布局,其中包括动画。它讨论了如何使用CoreAnimation更新约束

  • 我花了两天时间尝试了混合和纯自动布局方法的各种解决方案,以实现在自动布局之前简单的滚动视图设置,现在它是正式的了——我一定太傻了。我主要是在故事板中设置这个(嗯,就是这样)。 所以我请求帮助。 视图树: 按钮应该水平滚动(从左到右,反之亦然)。有人能告诉我如何设置约束来使用纯自动布局实现这一点吗??? -- 我尝试了混合方法,如下所示: ...以及根据Apple的TechNote为< code>c

  • 在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。下面是我用来设置更改动画的代码: 下面是创建所有可扩展视图的方法: 对我来说,问题不在于如何设置高度变化的动画,因为这是可行的,而在于解决一个事实,即在一段时间内,应用程序似乎忽略了顶部的约束。这是显示动画的gif

  • 虽然有几个问题的答案与我的相似,但似乎没有一个能解决我的困境。我有一个图像视图,我可以通过改变水平和垂直约束来移动它,并使用长按手势在屏幕上移动。如果这张图像没有移动一定的距离,我希望它能动画化回到原来的位置。我正在使用以下代码示例来尝试执行此操作: 和在其他地方定义为用户单击的位置 和定义为用户在超级视图中的位置 不用说,平移图像时,一切都正常。它会拖动,然后在手势结束时停止。问题是,如果用户没

  • 问题内容: 我正在使用来更新旧的应用,并且当没有广告时,它会滑出屏幕。出现广告时,它会在屏幕上滑动。基本的东西。 旧样式,我将帧设置在动画块中。新样式,我对自动布局约束有一个确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践” ,其中涵盖了动画。它讨论了如何使用CoreAnimation更新

  • 我设置了一个动画,以在打开另一个开关/标签时隐藏一个开关/标签。同时,刚刚打开的开关向上移动。这里的简单解释非常有效。 但是,当我在开关/标签关闭后尝试向下移动时,它不会移动。另一个开关会很好地重新出现,但不会触发顶部约束更改。 我对这种类型的设置和动画都是以编程方式进行的相对较新,在花了一个小时之后,我被难住了。是因为我正在制作相对于另一个顶部约束的动画吗?如果它第一次工作,这有什么关系?即使隐