如何访问使用 Paintcode 生成的 UIView 自定义 class 中的图层?

How to access a layer inside UIView custom class generate with Paintcode?

我正在为我的项目使用 Paintcode V3 和最后 Xcode。

在 Paintcode 中我画了一条红色路径,有点像 "clock hand" 带有半径变量以便能够旋转它。

在我的 Xcode 项目中,这个自定义 UIView 被添加到主视图中。

当红色路径旋转时,我需要知道它何时与视图的另一个元素相交。

我试过了:

if self.redPathView.frame.intersects(self.anotherView.frame) {       
    //do something...                   
}

但它无法工作,因为 redPathView 是整个 Paintcode canvas(方框)而不仅仅是红色路径。

我正在寻找一种方法来访问我视图中的红色路径。

有趣的问题。

我认为没有办法完全满足您的需求...
就像你提到的,当我们使用 PaintCode 时,我们的自定义绘图变成了整个 UIView.
我们无法访问其特定元素(例如您的 redPathView)。

(我偏爱这个问题,以防有人知道我们是否真的可以。我可能是错的。)

无论如何,有一个解决方法。您可以使用 PaintCode 本身来告诉您 "collisions" 何时发生。当然,然后您需要在那里绘制所有内容...并实施某种对您有意义的内部控制。

例如,在下图中,我创建了这个 "clock hand",具有检测红色物体何时接触其他 UI 元素的功能(关键点是 touchedElementID 表达式 - - 观察它如何使用矩形的 "ID" 更新自身):

您可能会发现这种方法存在一些问题,例如需要知道屏幕上其他元素的确切位置以及可能的复杂三元结构,例如:

(rotationSanitized <= -352 || rotationSanitized >= -8) ?
1 :
(rotationSanitized <= -82 && rotationSanitized >= -98) ?
2 :
(rotationSanitized <= -172 && rotationSanitized >= -188) ?
3 :
(rotationSanitized <= -262 && rotationSanitized >= -278) ?
4 : 0

此外,如何 "export" 和 Xcode 中的 StyleKit 使用此信息?

我做的技巧是在 PaintCode 中添加一个空的(没有 Fill,没有 Stroke)UI 元素并将 touchedElementID 表达式结果关联到 alpha 元素的值。

这样我就可以在我的自定义视图中访问表达式,例如通过 StyleKit.touchedElementID。但这引入了一个新问题,因为现在每次导出时我都必须更改生成的 StyleKit (两行代码,但仍然如此)。这是一种脆弱的解决方案。

但是,如果您对此没有意见,那么这只是使用这些新信息的问题...
为此,我创建了一个协议,因此我的 ViewController 可以充当我的自定义视图的委托,并在 PaintCode 中最内部的 UI 元素是 "touched" 时执行它需要做的任何事情。

这是最终结果:

最后,check this project in GitHub with all the code and samples.