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

UIView动画的完成块在动画完成之前被调用

谭富
2023-03-14

我有一个用于视图控制器交互式过渡的自定义动画师。还有一个模糊效果,根据过渡进度设置为nil。效果的动画代码如下:

@objc func blurEffectDissmisal() {

    UIView.animate(withDuration: dismissAnimator.durationOfAnimation + 1, animations: {
        self.blurEffectView?.effect = nil
    }) { (done) in
        if (done) {
       self.blurEffectView?.removeFromSuperview()
        }
    }
}

我通过通知调用它,当从它到第一个的转换开始时,它在第二个视图控制器上调用。

然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。

我也曾尝试将动画添加到我的动画师中,但也没有成功。

此外,当我取消转换时,在实际动画结束之前调用完成块(在这种情况下,我理解为什么,但不知道如何使其向后移动。也许我应该在完成块中创建反向动画?)

如你所见,我已经尝试了这个答案中的建议,但没有帮助。

如果你知道如何解决这个问题,我将非常感谢你的帮助。

共有3个答案

谭飞掣
2023-03-14
  UIView.animate(withDuration: 1, animations: {
                self.blurEffectView?.frame = CGRect(x: self.blurEffectView?.frame.origin.x, y: self.view.frame.size.height, width: self.blurEffectView?.frame.size.width, height: self.blurEffectView?.frame.size.height)
            }, completion: {
                (value: Bool) in
                self.blurEffectView?.removeFromSuperview()
            })  

使用相同的动画(在UIView上),我能够实现以下目标:

帅煌
2023-03-14

我已经创建了一个游乐场,您可以在其中查看此更改,只需创建新游乐场,单击助手编辑器(左上角,两个连接的圆圈)并查看动画。这应该可以。

import PlaygroundSupport
import UIKit


let rect = CGRect(x: 0, y: 0, width: 40, height: 40)
let view = UIView(frame: rect )
view.backgroundColor = UIColor.yellow
let label = UILabel(frame: rect)
label.text = "A"
label.textAlignment = .center
view.addSubview(label)

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView)

PlaygroundPage.current.liveView = view

UIView.animate(withDuration: 4, animations: {
    blurEffectView.alpha = 0
}) { (done) in
    if (done) {
        blurEffectView.removeFromSuperview()
    }
}

您面临的问题不是UIView。动画并不能完成它的工作,这只是因为您将视图设置为“零”是不可动画的。想象一下删除一些可以设置动画的东西。。。

公冶光亮
2023-03-14

在调用动画函数之前使用延迟。

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        UIView.animate(withDuration: 2.0,delay: 0, animations: {
            self.frame.origin.x = -2000
        }) { (done) in
            if(done){
                self.removeFromSuperview()
            }
            
        }
    }
 类似资料:
  • 我在我正在开发的应用程序中发现了一个奇怪的错误。在我进入细节之前,我将陈述我的问题 1-为什么不能调用UIView动画完成块 2-为什么在显示模式视图后会调用UIView动画完成块? 我有一系列UIView动画,它们在视图控制器出现后开始。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用。 此外,当我从当前视图控制器模态地呈现一个新的视

  • 每当此动画结束时,我都会尝试调用一个方法,但在某些情况下,例如,当用户离开应用程序时,它的完成块永远不会被调用。此外,当VC与UIView动画同时出现时,完成块永远不会被调用。 即使动画以某种方式中断,我应该如何确保调用回调?我是否应该根本不使用UIView动画完成块,而是使用其他内容?请开导我。。!

  • 我有一个动画块来执行一个简单的基于变换的动画,在完成时从它的超级视图中删除有问题的视图。 然后我使用Tech Q详述的代码 但是,此代码不会阻止完成代码的执行。因此,为了防止代码执行,我将完成代码更改为: 当检查finished==TRUE时,动画块暂停时,将阻止执行完成代码。如果在“取消暂停”动画之前超过持续时间,则不会执行完成代码。即在本例中,msgView仍保留在superview中。 是否

  • 我正在为数组中的每个UIView设置动画,我想知道所有动画何时完成。例如:我用一个简单的缩放动画在ViewController上显示10个UIView,每个UIView都有一个小延迟。在所有10个动画完成后,我想在完成块中再做一个动画。 我如何知道所有动画何时完成?

  • 非常简单的动画: 动画工作得很好。但是,完成块被调用了两次。这也很好,我知道我需要检查布尔值,看看它是否真的完成了。嗯,不仅完成块被调用了两次,而且两次都完成了。 我怎么知道动画是否真的完成了?

  • 由于网络问题,我可能会调用UIView动画函数两次。不知何故,这似乎会搞乱您在完成块中获得的完成布尔值。 在动画期间,我将UIView移出屏幕。在动画结束时,它应该将我正在制作动画的帧设置为隐藏。我注意到完成块中完成的BOOL总是设置为YES。因此,当我第二次调用动画时,在对动画的第一次调用完成之前,它将设置为BOOL完成,即使我希望它设置为NO,因为动画被对同一动画的新调用中断。 我也尝试添加以