2017-03-08 61 views
0

我正在为用户创建一种方法来在屏幕上移动多边形,并通过拖动角点顶点来更改它们的形状。然后我需要能够在其他设备上重新绘制这些修改的多边形 - 所以我需要能够在屏幕上获得所有多边形的所有顶点的最终位置。路径转换后可以获取UIBezierPath当前控制点吗?

这是我目前在做什么:

我画使用UIBezierPathdrawRect功能的覆盖每个形状的多边形。然后,我允许用户通过应用CGAffineTransformMakeTranslation函数和xy坐标增量在touchedMoved函数覆盖中在屏幕上拖动它们。我有初始控制点从中初始绘制多边形(如描述here)。但是一旦路径实例在屏幕上移动,这些值不会改变 - 所以我只能获得初始值。

Core Graphics框架内有什么内置的东西,可以让我抓取UIBezierPath实例中的一组当前控制点?我试图避免手动跟踪这些点。我会考虑用其他方式吸引用户,如果:

  • 有一个内置 - 中的方式来检测一个点位于该多边形内(如UIBezierPath#contains方法
  • 一种能够方便地引入约束使用户可以” T移至多边形走出上海华盈的界限(我需要整个多边形是可见的)
  • 一种能够方便地抓住所有的点,当用户完成
  • 一切都可以在iPhone 5
下60fps的运行

感谢您的时间!

回答

1

由于您只将变换应用于视图/图层,要从路径中获取转换后的控制点,只需将相同的变换应用于路径,然后获取控制点即可。喜欢的东西:

UIBezierPath* copiedPath = [myPath copy]; 
[copiedPath applyTransform:[view transform]]; 
[self yourExistingMethodToFetchPointsFromPath:copiedPath]; 

了目前正在从通道拉出点的方法是在不幸从输入UIBezierPath可用于重新取点的唯一API。然而 - 你可能对我写的一个图书馆感兴趣,这个图书馆使贝塞尔路径更简单:PerformanceBezier。这个库使得显著更容易地从路径获得积分:

for(NSInteger i=0;i<[path elementCount];i++){ 
    CGPathElement element = [path elementAtIndex:n]; 
    // now you know the element.type and the element.points 
} 

除了增加功能,使道路更容易使用,它也增加了一个缓存层对现有的API,使性能的顶部打击路径要小得多。根据您在UIBezierPath方法上花费多少CPU时间,该库将会有重大改进。我看到了between 2x and 10x improvement,这取决于我使用的操作。

相关问题