iOS自定义UIView绘图 - CAShapeLayers还是drawRect?

use*_*182 5 core-animation calayer uiview drawrect ios

我是iOS UIView绘图的新手,我真的想以UIView标准方式实现自定义类.

UIView我现在正在研究的课程很简单:它主要是静态背景形状,形成复合形状.我还想为这个UIView类添加动画,以便一个简单的形状可以在静态形状的顶部设置其路径的动画.

我目前是如何实现这一点的

现在,我正在子类的drawRect:方法中实现静态绘图UIView.这很好用.我还没有实现单一形状的动画.

我想要回答的问题

问题1:

drawRect:我正在进行的方法中绘制方法中的静态形状是否更好,或者是否有利于重构绘制到类扩展范围CAShapeLayer属性中的所有形状并执行以下操作:

-(instancetype) initWithFrame:(CGRect) frame
{
   if (self = [super initWithFrame:frame])
   {
      [self setupView];
   }

   return self;
}

-(void) setupView // Allocate, init, and setup one-time layer properties like fill colorse.
{
   self.shapeLayer1 = [CAShapeLayer layer];
   [self.layer addSubLayer:shapeLayer1];
   self.shapeLayer2 = [CAShapeLayer layer];
   [self.layer addSubLayer:shapeLayer2];
   // ... and so on
}

-(void) layoutSubviews // Set frames and paths of shape layers here.
{
    self.shapeLayer1.frame = self.bounds;
    self.shapeLayer2.frame = self.bounds;

    self.shapeLayer1.path = [UIBezierPath somePath].CGPath;
    self.shapeLayer2.path = [UIBezierPath somePath].CGPath;
}
Run Code Online (Sandbox Code Playgroud)

问题2: 不管我是否实现静态形状,CAShapeLayers或者drawRect:,为实现一个动画形状的最佳方式是UIView一个CAShapeLayer与其他被执行财产CAShapeLayers就上述实施?UIView为一个动画形状创建一个完整的单独类并将其作为子视图添加到此视图中似乎很愚蠢,所以我认为a CAShapeLayer是实现这一目标的方法.

非常感谢任何帮助!

Dun*_*n C 1

您可以采用任何一种方法,但对所有内容使用形状图层可能会更干净、更快。形状图层具有使用核心动画的内置动画支持。

避免实现drawRect而让系统为您绘制通常会更快。

编辑:

事实上,我会比 2014 年更强烈地表达这一点。iOS 中的底层绘图引擎针对使用图层的平铺渲染进行了优化。通过使用 CALayers 和 CAAnimation(或基于 CAAnimation 构建的更高级别的 UIView 或 SwiftUI 动画),您将获得更好的性能和更流畅的动画。