You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写draw方法后自定义UIView失去UIView.animate动画能力的原因

重写UIView的draw方法后无法执行UIView动画的原因

问题说明

我创建了继承自UIView的自定义类,重写draw(_:)方法用于绘制自定义形状,之后发现该视图无法通过UIView.animate执行动画。目前已找到通过view.layer.addSublayer添加形状的替代方案,但想弄明白为什么重写draw(_:)会让视图失去动画能力,希望能给新手开发者一些参考。

测试代码如下:

import UIKit

class ViewController: UIViewController {

    var shapeView: CustomShapeView = {
        let view = CustomShapeView()
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(shapeView)

        NSLayoutConstraint.activate([
            shapeView.widthAnchor.constraint(equalToConstant: 100),
            shapeView.heightAnchor.constraint(equalToConstant: 100),
            shapeView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            shapeView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        self.shapeView.backgroundColor = .green

        UIView.animate(withDuration: 5.0, animations: { [weak self] in
            self?.shapeView.backgroundColor = UIColor.red
        })
    }

    class CustomShapeView: UIView {
        override func draw(_ rect: CGRect) {

        }
    }
}

核心原因

  • 后备存储的创建:只要重写了draw(_:)方法,无论实现是否为空,系统都会认为你需要手动绘制内容,因此会为该视图创建一个位图后备存储(backing store)。所有绘制操作都会渲染到这个位图上,视图的显示本质变成了展示这张静态位图。
  • 隐式动画的禁用:UIView.animate依赖的是CALayer的隐式动画机制——它会自动为图层的可动画属性(比如backgroundColor、bounds等)生成过渡动画。但当视图拥有后备存储时,系统会自动关闭图层的隐式动画,因为对位图做动画的性能开销极高,且不符合常规动画的交互预期。
  • 绘制逻辑的优先级:重写draw(_:)后,视图的显示优先级会偏向手动绘制的内容,图层属性的动态变化会被位图覆盖,自然无法触发动画效果。

可行解决方案

  • 移除不必要的draw(_:)重写:如果不需要手动绘制内容,直接删掉draw(_:)方法,视图会恢复默认的图层动画能力,UIView.animate就能正常工作。
  • 使用子图层实现自定义绘制:像你已经尝试的那样,通过view.layer.addSublayer添加CAShapeLayer等专用图层来绘制自定义形状。这种方式下,主视图的图层不受影响,依然支持隐式动画,不会干扰背景色、位置等属性的动画。
  • 手动触发重绘(不推荐):如果必须保留draw(_:),可以在动画闭包中调用setNeedsDisplay()强制重绘,但这种方式的动画流畅度和性能远不如直接操作图层属性,仅适合特殊场景。

内容的提问来源于stack exchange,提问作者iwazovsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:05:31