Есть ли у Apple способ скопировать внешний вид одного представления (то есть то, что вы физически видите на экране) в буфер изображения? - PullRequest
0 голосов
/ 14 марта 2020

У нас есть UIView, который, при касании, мы хотим, чтобы «копия» того, что появляется на экране, одновременно двигалась вверх, увеличивалась и исчезала как визуальная подсказка, которую пользователь нажимал на этот конкретный элемент. Думайте об этом, как о чем-то вроде «симпатии» на сайте, чтобы придать ему немного визуального изящества. Есть ли у Apple какой-либо встроенный способ извлечь копию изображения, которое визуально появляется на экране, в изображение?

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

Упрощенное обновление

Вот версия расширения animateUserReaction, которая использует встроенную функцию UIView snapshotView, устраняя необходимость в помощнике makeImageSnapshot функция.

func animateUserReaction() {

    guard let containerView = superview,
          let snapshotView  = snapshotView(afterScreenUpdates:true)
    else {
        return
    }

    // Make sure to match the frame to the current frame
    snapshotView.frame = frame

    containerView.addSubview(snapshotView)

    UIView.animate(
        withDuration : 0.5,
        delay        : 0,
        options      : [.beginFromCurrentState, .curveEaseOut],
        animations: {
            snapshotView.transform       = CGAffineTransform(scaleX: 2, y: 2)
            snapshotView.frame.origin.y -= snapshotView.frame.size.height * 1.5
            snapshotView.alpha           = 0
        },
        completion: { _ in
            snapshotView.removeFromSuperview()
        }
    )
}

Оригинальный ответ ...

Понятно! Это от коллеги, у которого нет учетной записи StackOverflow (?? !!!), но вот она! Отлично! Спасибо, Джон! Теперь получите учетную запись !!!

Сделайте копию UIView и сохраните в UIImage

extension UIView {

    func makeImageSnapshot() -> UIImage? {
        // NOTE: 0.0 scale is to respect retina (prevents pixelation)
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
        defer {
            UIGraphicsEndImageContext()
        }

        guard let context = UIGraphicsGetCurrentContext() else {
            return nil
        }

        layer.render(in: context)

        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

Анимируйте эту копию ...

extension UIView {

    func animateSnapshotOfSelf() {

        guard let containerView = superview,
              let snapshot      = makeImageSnapshot()
        else {
            return
        }

        let imageView = UIImageView(frame: frame)
        imageView.image = snapshot
        containerView.addSubview(imageView)

        UIView.animate(withDuration: 0.75, delay: 0, options: [.beginFromCurrentState, .curveEaseOut], animations: {
            imageView.transform = CGAffineTransform(scaleX: 2, y: 2)
            imageView.frame.origin.y += -100
            imageView.alpha = 0
        }, completion: { _ in
            imageView.removeFromSuperview()
        })
    }
}
1 голос
/ 14 марта 2020

Да, это называется снимком.

https://developer.apple.com/documentation/uikit/uiview/1622531-snapshotview

...