UIView.transition animation Работает только один раз, второй раз картинка просто пропадает - PullRequest
1 голос
/ 25 мая 2020

Как сделать анимацию последовательной?

func addBlurTo(_ image: UIImage) -> UIImage? {

    guard let ciImg = CIImage(image: image) else { return nil }
    let blur = CIFilter(name: "CIGaussianBlur")
    blur?.setValue(ciImg, forKey: kCIInputImageKey)
    blur?.setValue(1 , forKey: kCIInputRadiusKey)
    if let outputImg = blur?.outputImage {
        return UIImage(ciImage: outputImg)
    }
    return nil
}

А для кнопки:

@IBAction func Button7(_ sender: UIButton) {

        UIView.transition(with: imageView, duration: 1, options: .transitionCrossDissolve, animations: {
            guard let testImage = self.imageView.image else {return}
            self.imageView.image = self.addBlurTo(testImage)
        }, completion: nil)
}

1 Ответ

1 голос
/ 26 мая 2020

Вам нужно немного изменить вашу функцию на следующую, и она должна работать. Проблема заключается в преобразовании ciImage в UIImage без использования контекста. См. Здесь:

Если объект UIImage был инициализирован с помощью объекта CIImage, значение свойства равно NULL.

и здесь:

Генерация qr-кода с помощью swiftui показывает пустое изображение

func addBlurTo(_ image: UIImage) -> UIImage? {

            guard let ciImg = CIImage(image: image) else { return nil }
            let blur = CIFilter(name: "CIGaussianBlur")
            blur?.setValue(ciImg, forKey: kCIInputImageKey)
            blur?.setValue(1 , forKey: kCIInputRadiusKey)
            if let outputImg = blur?.outputImage {
                let context = CIContext()
                guard let cgOutput = context.createCGImage(outputImg, from: outputImg.extent) else { return nil }
                return UIImage(cgImage: cgOutput)
            }
            return nil
        }
...