如何访问使用 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.
我正在为我的项目使用 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.