如何访问使用 Paintcode 生成的 UIView 自定义类中的图层?
Posted
技术标签:
【中文标题】如何访问使用 Paintcode 生成的 UIView 自定义类中的图层?【英文标题】:How to access a layer inside UIView custom class generate with Paintcode? 【发布时间】:2017-08-05 21:55:22 【问题描述】:我正在为我的项目使用 Paintcode V3 和最后一个 Xcode。
在 Paintcode 中,我绘制了一条红色路径,一种带有半径变量的“时钟指针”,以便能够旋转它。
在我的 Xcode 项目中,这个自定义 UIView 被添加到主视图中。
当红色路径旋转时,我需要知道它何时与视图的另一个元素相交。
我试过了:
if self.redPathView.frame.intersects(self.anotherView.frame)
//do something...
但它不能工作,因为 redPathView 是整个 Paintcode 画布(方形框架),而不仅仅是红色路径。
我正在寻找一种方法来访问我的视图的红色路径。
【问题讨论】:
【参考方案1】:有趣的问题。
我认为没有一种方法可以完全满足您的需求...
就像你提到的,当我们使用 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 中添加一个空的(没有Fill
,没有Stroke
)UI 元素,并将touchedElementID
表达式结果与元素的alpha
值相关联。
这样我可以在我的自定义视图中访问表达式,例如通过StyleKit.touchedElementID
。但这引入了一个新问题,因为现在我每次导出时都必须更改生成的StyleKit
(两行代码,但仍然如此)。这是一种脆弱的解决方案。
但是,如果您对此感到满意,那么只需使用这些新信息即可...
为此我创建了一个协议,所以我的ViewController
可以充当我的自定义视图的代理,并在 PaintCode 中的大多数内部 UI 元素被“触摸”时执行它需要做的任何事情。
这是最终结果:
最后,check this project in GitHub with all the code and samples。
【讨论】:
好的,你的解决方案可能对我来说是可行的,“你必须在每次导出时更改生成的 StyleKit”。我一直使用 PaintCode,而且我确定我会忘记添加 2 行……我将尝试另一种解决方案,也许没有 PaintCode。谢谢 是的,我也经常使用 PaintCode。你的担心是可以理解的。 :-)以上是关于如何访问使用 Paintcode 生成的 UIView 自定义类中的图层?的主要内容,如果未能解决你的问题,请参考以下文章
Paintcode 为自定义按钮生成 iOS 代码(不工作)
Objective C - 从这个 PaintCode 代码创建 UIImage