【问题标题】:Create multiple CGPath in a loop循环创建多个CGPath
【发布时间】:2013-11-20 05:58:25
【问题描述】:

我正在创建一个包含地图的程序,为了检查 mouseDown 发生在哪个区域,我想为每个区域创建一个 CGPath。目前我创建了这部分:

int brestPoints[] = {755,751,684,765,655,851,586,905,607,940,718,898,716,954,741,960,743,938,775,925,761,872,767,815};

brest = CGPathCreateMutable();

for (int i = 0; i < sizeof(brestPoints); i=i+2) {
    if (i == 0) {
        CGPathMoveToPoint(brest, NULL, brestPoints[i], 2203-brestPoints[i+1]);
    } else {
        CGPathAddLineToPoint(brest, NULL, brestPoints[i], 2203-brestPoints[i+1]);
    }
}

CGPathCloseSubpath(brest);

我的问题是我要创建 75 个 CGPath,我想遍历多个数组以一次创建它们。

对我来说理想的解决方案是拥有一个字典,其中包含对象数组和键的区域名称。但我不能将数组作为对象,因为它只能存储对象。 将所有 75 组坐标重写为仅包含 NSNumber 会很挑剔。

有什么想法吗?

更新

我认为对于我正在尝试做的事情可能存在混淆,我有 75 个这样的 C 数组:

int brestPoints[] = {755,751,684,765,655,851,586,905,607,940,718,898,716,954,741,960,743,938,775,925,761,872,767,815};
int picardyPoints[] = {769, 884, 778, 919, 859, 959, 956, 894, 949, 864, 864, 899, 842, 889};

我需要一些方法来为每个数组创建(简单地)一个 NSBezierPath 或 CGPath。并且仍然知道哪个Path属于哪个数组(每个数组对应我地图的一个区域)。

所以我考虑将所有数组放入一个 NSDictionary 中,该 NSDictionary 将有一个与区域名称关联的数组作为键。这样我就可以遍历字典来创建我所有的路径,并且仍然可以了解它们所属的区域。但我似乎可以找到一种方法来做到这一点,因为 C 数组可以放在 NSDictionary 中。

【问题讨论】:

    标签: objective-c arrays loops nsdictionary cgpath


    【解决方案1】:

    我会做什么:将 C 数组放入 C 数组中(如果它们还没有的话)。将路径以相同的顺序放入 CFArray 中。然后你可以匹配索引。

    【讨论】:

      【解决方案2】:

      由于您在文本编辑器中手动创建了 int 数组,您只需使用 find/replace 将它们格式化为具有 NSNumber 值的 NSDictionary 文字和 NSArray。

      NSDictionary * regionPoints = { @"brest" : @[ @(1), @(2) ], 
                                      @"picardy" : @[ @(1), @(2) ]};
      

      现在您可以为 UIKit (iOS) 构造 UIBezierPath 或为 AppKit (OSX) 构造 NSBezierPath 而不是 CGPath 对象。添加 NSBezierPath 作为字典中的值。构造完成后,您不再需要访问 int 数组,因为 NSBezierPath 具有确定点是否包含在路径中以及能够绘制路径的方法。

      【讨论】:

      • 我将代码更改为使用 NSBezierPath(我正在使用 AppKit)。但我仍然不明白如何从我的 75 个坐标数组中创建所有 NSBezierPath 对象。我尝试将所有数组放入 NSDictionary 但它不会接受我的数组,因为它们是整数而不是对象。
      • 这并不能真正回答问题。
      • 您构造 NSBezierPath 并将其与您的字符串键一起存储在 NSDictionary 中,然后再也不需要 int 数组。 NSBezierPath 具有命中测试的方法(确定一个点是否在路径中)。
      • 我明白这一点,但是如何在不编写 75 次相同代码的情况下创建我的 75 个 bezierPaths 呢?我想使用某种循环一次在我的所有数组上执行此操作。
      • 您还没有展示如何获得 75 个阵列。你只是从某个地方复制/粘贴它们吗?您是否正在调用一个函数来获取它们?
      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多