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

时间:2018-02-04 13:39:49

标签: ios swift uiviewcontroller uiviewanimation

我有view controller互动转换的自定义动画师。根据转换进度,还有blur effect设置为nil。效果的动画代码如下:

@objc func blurEffectDissmisal() {

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

我用notification来调用它,当它从第一个view controller转换到第一个import io import os # Imports the Google Cloud client library from google.cloud import vision from google.cloud.vision import types # Instantiates a client client = vision.ImageAnnotatorClient() # The name of the image file to annotate file_name = os.path.join( os.path.dirname(__file__), 'face.jpeg') # Loads the image into memory with io.open(file_name, 'rb') as image_file: content = image_file.read() image = types.Image(content=content) response = client.annotate_image({'image': image, 'features': [{'type': vision.enums.Feature.Type.FACE_DETECTION,'max_results':40}],}) print response # Print joy likelihood for face in response.face_annotations: print(face.joy_likelihood) 时,会调用它。

但是,我有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时它工作正常,但在子结果运行期间它没有。

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

此外,当我取消转换时,在实际动画结束之前调用完成块(在这种情况下,我理解为什么但是不能弄清楚如何让它向后移动。也许我应该创建一个反向动画在完成区?)

我已经尝试过这个answer的建议,但是没有帮助。

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

3 个答案:

答案 0 :(得分:1)

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

        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 :(得分:0)

  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上)我能够做到这一点:

enter image description here

答案 2 :(得分:0)

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

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.animate没有做到这一点,只是因为你将视图设置为nil是不可动画的。想象一下,删除某些东西可以动画......