在 UIView 或 GLKView 上绘图?

Posted

技术标签:

【中文标题】在 UIView 或 GLKView 上绘图?【英文标题】:Draw on UIView or GLKView? 【发布时间】:2016-11-15 10:47:11 【问题描述】:

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

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

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

仅供参考,我不知道任何一种方法,但想学习两种方法,所以不要回答“你最了解的”。我只是在询问性能。

【问题讨论】:

你想画什么? 你打算将它用于ios普通应用还是iOS游戏? @KrishnaChaitanyaAmjuri 是一个 iOS 应用,而不是游戏。 @User511 一行带有一些点。 【参考方案1】:

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

【讨论】:

您建议在 UIView 中使用 draw 方法而不是 GLKView 来获得简单的线条? GLKView 使用 openGL。开放图形库 (OpenGL) 用于可视化 2D 和 3D 数据。它是一个多用途的开放标准图形库,支持 2D 和 3D 数字内容创建、机械和建筑设计、虚拟原型、飞行模拟、视频游戏等应用程序。如果您要创建一个简单的应用程序,并且对于其中的一条简单线,我认为不需要使用 GPU。如果是游戏,那就不一样了 如何在这条线上画一个圆圈? 你想要虚线吗?类似........。如果这就是你想要的,那么这里已经有了答案:***.com/questions/26018302/… 不,是这样的:vanseodesign.com/blog/wp-content/uploads/2010/03/dots-line.png【参考方案2】:

法线

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];

【讨论】:

以上是关于在 UIView 或 GLKView 上绘图?的主要内容,如果未能解决你的问题,请参考以下文章

在 GLKView 类型的对象上找不到属性“层”

002-GLKView是如何工作的

在UI视图顶部的OpenGL GLKView覆盖 - iOS / Xcode

iPhone/iPad 设备上的 OpenGL 渲染 GL_POINTS 看起来很糟糕(但在模拟器中看起来完全没问题)

为啥在 ViewDidLoad 中没有设置 GLKView 的 DrawableWidth?

当我继承 UIView 时,为啥我不能在图像上绘图?