在 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];
我需要画一条带有一些点的分隔线。我决定使用 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];