在 UIView 或 GLKView 上绘制?

Draw on UIView or GLKView?

我需要画一条带有一些点的分隔线。我决定使用 draw 方法来执行此操作,而不是包含分隔符的图像。我这样做是为了提高性能和可定制性,因为分隔符有时会发生变化。

现在我研究了 UIView 上的 draw() 方法,我注意到 Apple 建议在使用 OpenGL 绘图时使用 GLKView

简单的分隔符,调用OpenGL会不会太麻烦?还是 OpenGL 开销可以忽略不计?那我什么时候想使用原生 UIKit draw()

仅供参考,我不知道这两种方法,但想学习这两种方法,所以不要回复 "what you know best"。我只是问性能。

OpenGL 使用 GPU 而不是 CPU 进行计算。如果您正在制作游戏应用程序之类的东西,那么您可以考虑使用 OpenGL。我相信您想在 iOS 应用程序中画一条线。为此,您可以在 UIView 中使用 drawRect 方法或创建一个 shapeLayer 并将其添加为子层。

以下示例将向您展示:

CAShapeLayer *simpleLine = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, 80)];
[path addLineToPoint:CGPointMake(300, 80)];
simpleLine.lineWidth = 1.0;
simpleLine.path = path.CGPath;
simpleLine.strokeColor = [[UIColor blackColor] CGColor];
[[self.view layer] addSublayer:simpleLine];

要使用 drawRect,您应该在自定义 UIView 中执行此操作,而不是上述方法。

- (void)drawRect:(CGRect)rect {
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0, 80)];
    [path addLineToPoint:CGPointMake(300, 80)];
    path.lineWidth = 1.0;
    [[UIColor blueColor] setStroke];
    [path stroke];
}

如果您的分隔符参数发生变化并且您正在制作应用程序,最好使用 drawRect 方法。您可以随时使用 [CustomUIView setNeedsDisplay:YES]

调用此方法

编辑

你要的是圈上线。您可以先为 line 绘制 UIBezierPath,然后为 circle 添加 UIBezierPath

正常线

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10.0, 10.0)];
[path addLineToPoint:CGPointMake(100.0, 100.0)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [path CGPath];
shapeLayer.strokeColor = [[UIColor redColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
[self.view.layer addSublayer:shapeLayer];

虚线

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10.0, 10.0)];
[path addLineToPoint:CGPointMake(100.0, 100.0)];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.path = [path CGPath];
shapeLayer.strokeColor = [[UIColor redColor] CGColor];
shapeLayer.lineWidth = 3.0;
shapeLayer.fillColor = [[UIColor clearColor] CGColor];
shapeLayer.lineDashPattern = @[@4, @2];
[self.view.layer addSublayer:shapeLayer];