1

我一直在 iPhone 上使用 MapKit 的图层,我遇到的一个库就是这个:https ://github.com/mtigas/iOS-MapLayerDemo/ 。这很有帮助,而且似乎工作正常。但是,我试图通过并了解它是如何工作的,但我遇到了一些麻烦。

在这个页面上,例如:https ://github.com/mtigas/iOS-MapLayerDemo/blob/master/MapLayerDemo/Classes/CustomOverlayView.m ,在顶部,定义了4个自定义函数。我假设这些功能正在添加到 MKOverlayView 的正常功能上?问题是,我找不到这些新函数实际上是从哪里调用的,因此我在理解这个页面的工作原理时遇到了一些麻烦。它似乎不是来自项目中的任何其他文件。

我感谢任何帮助,谢谢。

4

1 回答 1

3

在评论中与您进行了一些扩展讨论后:

MKOverlayView 的可覆盖功能,例如canDrawMapRect不能轻易追溯到它们的调用代码,因为该代码在 MapKit.framework 中的某处被混淆了。

相反,典型的方法是重新阅读他们的文档,直到您了解框架使用该函数的目的。(有反编译二进制文件之类的东西,尽管这通常是不受欢迎的,我不推荐它。)

canDrawMapRect文档:http: //developer.apple.com/library/ios/documentation/MapKit/Reference/MKOverlayView_class/Reference/Reference.html#//apple_ref/doc/uid/TP40009715-CH1-SW10

在阅读了他们的文档后,我推断出: MapKit.framework 中的某处,在canDrawMapRect实际绘制视图之前被调用。如果你没有在你的子类中重写那个函数,它会调用超类的默认实现,它总是返回 YES 然后调用drawMapRect:(如果你是子类化 MKOverlayView 必须重写,否则什么都不会绘制!)

您在上面链接的类可能会返回 NO。在这种特殊情况下,MapKit.framework 中的代码似乎跳过了调用drawMapRect:,并且没有显示(或刷新)任何内容。

所以,长话短说:对于这种情况,您必须扮演代码​​侦探的角色,并希望文档写得足够清楚,以便在无法查看所有代码的情况下弄清楚。

编辑:只是为了进一步澄清 - 看来 MKOverlayView 必须被子类化才能实际生成可见的东西。


在解决您的潜在问题之前我的原始答案-

简短的回答:这些是在该类中使用的私有函数。

长答案:在实现文件顶部的空名称类别中声明的函数仅对该类别扩展的类可见。因此,这些函数只能在该类的实现中调用。(C++ 等价物只是将函数声明为私有)

这 4 个函数中的 3 个在同一个 .m 文件中调用。没有挖掘,我猜他们写了第一个函数,然后决定不使用它。

于 2011-07-26T19:30:01.350 回答