UITextView 上的(缩放)变换动画

(Scale) Transform Animation on UITextView

我的目标是为 UITextView 创建一个 "bubble-up" 动画,该动画嵌套在模态呈现的 UIView 卡片中。

虽然卡片出现了,但 UITextView 似乎没有..有什么解决方法吗?以下是我迄今为止尝试过的代码...

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    DispatchQueue.main.async {
        UIView.animate(withDuration: 1, delay: 0.1, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
            self.cardView.transform = CGAffineTransform(scaleX: 1, y: 1)              
            self.messageTextView.transform = CGAffineTransform(scaleX: 1, y: 1)  
        }, completion: nil)            
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    cardView.transform = CGAffineTransform(scaleX: 0, y: 0)
    messageTextView.transform = CGAffineTransform(scaleX: 0, y: 0)
}

我做了一个测试,我不得不为我的 UITextView 添加高度和宽度限制,否则它们会折叠成零尺寸并且不可见。

另请注意,您应该使用较小的非零比例值(例如 0.01)来表示较小的尺寸,而不是 0,至少对于缩小视图而言。如果您尝试将视图的比例动画化为零,它会消失而不是缩小。

编辑:

我还尝试了您的 spring 阻尼动画,发现使用您使用的 usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8 值时,spring 效果几乎不可察觉。如果我将阻尼调低到 0.5,弹跳效果会更好,但是当为视图缩小设置动画时,视图比例超过 0 比例并稍微倒转回来。

我不确定确切的设置,所以请展示故事板。我没有添加约束,而是在动画之前添加了 setNeedsLayout。希望对你有用。

          override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        DispatchQueue.main.async {
            self.messageTextView.setNeedsLayout()
            UIView.animate(withDuration: 1, delay: 0.1, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.8, options: .curveEaseOut, animations: {
                self.cardView.transform = CGAffineTransform(scaleX: 1, y: 1)
                self.messageTextView.transform = CGAffineTransform(scaleX: 1, y: 1)
            }, completion: nil)
        }
    }