在 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 上绘图?的主要内容,如果未能解决你的问题,请参考以下文章
在UI视图顶部的OpenGL GLKView覆盖 - iOS / Xcode
iPhone/iPad 设备上的 OpenGL 渲染 GL_POINTS 看起来很糟糕(但在模拟器中看起来完全没问题)