有趣的问题。
我认为没有一种方法可以完全按照您的要求进行操作...
就像您提到的那样,当我们使用 PaintCode 时,我们的自定义图纸会变成一个完整的UIView
.
我们无法访问其特定元素(例如您的redPathView
)。
(我喜欢这个问题,以防有人知道我们是否真的可以。我可能错了。)
无论如何,有一个解决方法。您可以使用 PaintCode 本身来告诉您“碰撞”何时发生。当然,那么您需要在那里绘制所有内容......并实施某种对您有意义的内部控制。
例如,在下图中,我创建了这个“时钟指针”,具有检测红色物体何时接触其他 UI 元素的功能(关键点是touchedElementID
表达式——观察它如何使用矩形的“ID”进行自我更新) :
使用这种方法可能会发现一些问题,例如需要知道屏幕上其他元素的确切位置以及可能复杂的三元结构,例如:
(rotationSanitized <= -352 || rotationSanitized >= -8) ?
1 :
(rotationSanitized <= -82 && rotationSanitized >= -98) ?
2 :
(rotationSanitized <= -172 && rotationSanitized >= -188) ?
3 :
(rotationSanitized <= -262 && rotationSanitized >= -278) ?
4 : 0
另外,如何在 Xcode 中与 StyleKit 一起“导出”和使用这些信息?
我所做的技巧是在 PaintCode 中添加一个空的(no Fill
,no Stroke
)UI 元素,并将touchedElementID
表达式结果与alpha
元素的值相关联。
这样我就可以在我的自定义视图中访问表达式,例如通过StyleKit.touchedElementID
. StyleKit
但这引入了一个新问题,因为现在我每次导出时都必须更改生成的内容(两行代码,但仍然如此)。这是一种脆弱的解决方案。
但是,如果您对此感到满意,那么只需使用这些新信息...
为此,我创建了一个协议,因此我ViewController
可以充当自定义视图的代表,并在PaintCode 中的大多数内部 UI 元素都被“触动”了。
这是最终结果:
最后,在 GitHub 中查看这个项目以及所有代码和示例。