问题标签 [cgpath]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - 绘制先前准备好的 CGPath 时,CATiledLayer 崩溃
我正在使用 CATiledLayer 作为我的 UIView 的支持层,我将它放在 UIScrollView 中。在我的视图的 init 方法中,我正在创建绘制简单线条的 CGPathRef 对象。当我试图在 drawLayer:inContext 中绘制这条路径时,它偶尔会在我滚动/缩放时与 EXEC_BAD_ACCESS 崩溃(很少)。
代码很简单,我只使用标准的 CG* 函数:
更新:我注意到这个问题只存在于 iOS 5 上,它在 4.3 上运行良好
objective-c - 使用 CGPath 有什么好处?
我是 CGPath 概念的新手,并且对贝塞尔曲线有一个不错的想法。我正在使用视图创建一个小的自由手绘程序。在 drawRect 中,我不断地从数组中绘制记录的一组线。当我的鼠标移动时,我向该数组添加一个新行并刷新视图。再次调用 drawrect 并再次绘制记录的线条集。
我正在阅读有关 CGPath 的信息,它说它在内部做的事情与我正在做的事情相似。存储一组直线和贝塞尔曲线。
那么,如果我使用 CGPath ,是否有任何性能改进?
objective-c - CGPath 作为字符串
有什么方法可以获取 CGPath 的实际数据,以便将其保存到文件中并在以后恢复?
是否有任何关于这些数据结构的文档?
我想把它写成一个字符串(如 SVG 路径字符串),或者用字典对象和 PList XML 文件的某种方式,但我会尽我所能!
objective-c - 应该使用什么算法来决定屏幕刷新时要重绘哪些行?
我制作了一个简单的基于 iOS 视图的应用程序,它可以让你在屏幕上绘制和擦除。我正在使用 NSMutableArray 来存储已经绘制的路径。每次我将控件从标记切换到橡皮擦时,反之亦然,我将当前的 CGPath 添加到数组并创建一个新的。
并且每次在drawRect中,我都会根据它是橡皮擦的路径还是标记的路径,用适当的颜色重绘数组的路径
并绘制当前正在绘制的触摸移动。
现在我知道这根本不是一个好的解决方案,并且随着数组大小的增长会消耗大量的 RAM。我的数组将已经包含冗余路径,这些路径实际上会越过已经用相同颜色着色的点,并且会不必要地占用处理器的时间来再次执行它以及内存。
任何人都可以参考更好的算法来节省资源吗?
calayer - 设置新创建的 CAShapeLayer 的正确框架
简而言之:
- Apple 不会自动为 a设置
frame
or (并且 Apple 还没有实现等效的bounds
CAShapeLayer
[UIView sizeThatFits]
- 如果您使用路径边界框的大小设置框架......一切都会出错。无论您如何尝试设置它,它都会搞砸路径
那么,以编程方式设置新创建的框架的正确方法是CAShapeLayer
什么CGPath
?苹果的文档对此事保持沉默。
我尝试过的东西不起作用:
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层
frame
- 它是{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
帧现在是正确的,但路径现在是双偏移 - 更改
frame
导致路径有效移动额外(x,y)
像素的原因放:
layer.bounds = CGPathGetBoundingBox( layer.path )
- ......一切都疯了。没有任何意义了
- 尝试通过这样做来修复它
layer.position = CGPathGetBoundingBox( layer.path ).origin
- ...没有骰子; 还是疯了。
我尝试过的一件事确实有效,但在其他地方引起了问题:
编辑:一旦您自动旋转屏幕,就会中断。我的猜测:Apple 的自动旋转需要控制“转换”属性。
- 创建一个
CAShapeLayer
- 创建一个
CGPath
,将其添加到图层 - 检查图层的框架 - 它是
{{0,0},{0,0}}
- 放:
layer.frame = CGPathGetBoundingBox( layer.path )
- 放:
layer.transform = CGAffineTransformMakeTranslation( CGPathGetBoundingBox( layer.path ).origin.x * -1, // same for y-coord: set it to "-1 * the path's origin
这可行,但是......许多第 3 方代码假定 a 的初始转换CALayer
是身份。
不应该这么难!当然,我在这里做错了什么?
(我有一个建议:“每次添加路径时,手动运行自定义函数以将所有点移动-1 * (top-left-point.x, top-left-point.y)
”。同样,这有效 - 但它非常复杂)
iphone - 我应该使用哪种算法来更改/修改曲线
我制作了一个使用 UIBezierPath 绘制多条曲线的应用程序。现在我正在尝试在其中实现修改功能。要修改特定曲线,我可以做的一件事是再次绘制所有曲线;我还没有实现这个。但是我认为当曲线数量增加时,这种算法效率不会很高,因为我必须将所有点存储在数组中,并且每次进行修改时都必须运行 for 循环来绘制每条曲线。
我正在寻找更有效的算法。如果有人可以提供示例代码,那将会很有帮助。
iphone - 不规则形状的 UIBezierPath 填充
我正在做一些自定义控件。控件的其中一个子视图是透明的,并且绘制UIView
了路径。UIBezierPath
在其中一张照片上,我们只说边界UIBezierPath
(称为 [路径笔划]),但在第二张照片上,您可以看到当我调用 [路径填充] 时会发生什么。我想要填充路径以创建类似于第一张照片上的形状。drawRect
这个透明UIView
的方法如下。
感谢帮助 !
objective-c - 频繁绘制 CGPath 时的性能
我正在开发一个将数据可视化为折线图的 iOS 应用程序。CGPath
该图以全屏自定义方式绘制UIView
,最多包含 320 个数据点。数据经常更新,需要相应地重新绘制图表——10/秒的刷新率会很好。
到目前为止很容易。然而,我的方法似乎需要大量的 CPU 时间。以每秒 10 次的速度用 320 段刷新图表会导致 iPhone 4S 上进程的 CPU 负载为 45%。
也许我低估了引擎盖下的图形工作,但对我来说,这项任务的 CPU 负载似乎很大。
下面是我的drawRect()
函数,每次准备好一组新数据时都会调用它。N
保存点的数量,points
是一个CGPoint*
带有要绘制坐标的向量。
我尝试先渲染到离线 CGContext 的路径,然后按照此处的建议将其添加到当前层,但没有任何积极的结果。我还摆弄了一种直接绘制到 CALayer 的方法,但这也没什么区别。
有什么建议可以提高这项任务的性能吗?还是我意识到,渲染对 CPU 的工作量更大?OpenGL有什么意义/区别吗?
谢谢/安迪
更新:我也尝试使用UIBezierPath
而不是CGPath
. 这里的这篇文章很好地解释了为什么这没有帮助。调整CGContextSetMiterLimit
等。也没有带来很大的缓解。
更新 #2:我最终切换到了 OpenGL。这是一个陡峭且令人沮丧的学习曲线,但性能提升令人难以置信。然而,CoreGraphics 的抗锯齿算法比 OpenGL 中的 4 倍多重采样做得更好。
objective-c - 如何将 CGPath 保存到文件中
我在 CALayers 中绘制了大约 20 个简单的形状,如下图所示(在 CAShapelayer 中绘制的 CGPaths)。现在我有一个非常长的文件,其中包含这种格式的所有 20 种形状。创建父 UIView 时,它会根据前一个屏幕中选择的内容加载其中一个形状。这工作正常,但维护形状代码太麻烦了。将下面的代码块存储到我可以在需要时调用和执行的单个文件中的最佳方法是什么?(即:star.txt、apple.txt、moon.txt、tree.txt):
ios - 将颜色燃烧限制在 CGPath 的内部
我有一个定义为 CGPath(实际上是 CGMutablePath)的封闭路径。
我想对路径定义的 UIImage 的特定区域进行彩色刻录。我一直在摆弄 Core Graphics,但目前我唯一的选择是为由 CGRect 定义的矩形区域着色,而不是路径。
谁能指出我正确的方向?
- 更新
在 Rob 的帮助下,我设法将我从相机得到的图像旋转了 90 度,让它在 UIImageview 中正确显示。
我剩下的唯一问题是我需要绘制的路径仍然是 90 度,并且超出比例。我目前使用的代码如下:
下图是结果。红色矩形是 CGPATH 的表示。白色方块其实是上面的方法在路径上的结果。
http://i41.tinypic.com/f1zbdi.png
我想我需要使用 COS 数学手动将 CGPATH 旋转 90 度,而不是什么......虽然我可能会监督一些事情......?