Упрощенное обновление
Вот версия расширения 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()
})
}
}