动画 UITextView 导致动画时文本消失

Pau*_*aul 5 animation uitextview ios swift

我正在尝试通过更改变换来为 UITextView 制作动画。但它会使文本在动画时消失。这是我的测试代码。

class ViewController: UIViewController {
    let textView = UITextView()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        textView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textView)
        
        textView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        textView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        textView.heightAnchor.constraint(equalToConstant: 300).isActive = true
        textView.backgroundColor = .systemOrange
        textView.text = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"
        textView.textColor = .white

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            let animator = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:  {
                self.textView.transform = CGAffineTransform(translationX: 0, y: 1000)
            })
            animator.startAnimation()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

我尝试使用故事板,但结果是相同的。当我使用UIView.animate方法时,结果相同。

为什么会出现这种情况?我想用文字来制作动画。

更新

let contraint = textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
contraint.isActive = true

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    contraint.constant = 1000
    let animator = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:  {
        self.view.layoutIfNeeded()
    })
    animator.startAnimation()
}
Run Code Online (Sandbox Code Playgroud)

我用这段代码进行了测试,得到了相同的结果。

mat*_*att 4

恐怕您必须对快照视图进行动画处理:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    let v = self.textView.snapshotView(afterScreenUpdates: true)!
    v.frame = self.textView.frame
    self.view.addSubview(v)
    self.textView.isHidden = true
    let animator = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:  {
        v.frame.origin.y = 1000
    })
    animator.startAnimation()
}
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个糟糕的解决方案;毕竟,这就是快照视图的用途。