2011-07-26 275 views
1

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

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

我感谢任何帮助,谢谢。

+0

看过整个项目,它们不会从我看到的任何地方被调用,也许值得放入几条日志语句以查看它们是否被调用? 它可能只是它们是为了您的方便而留下的有用功能,但对于项目运行来说并不是必需的。 – MCannon

+0

感谢您的回复。他们的确从项目中被调用,但对于我来说,我无法弄清楚在哪里。 –

回答

3

后在评论中跟大家做一些扩展讨论:

MKOverlayView的手动操作,能功能,如canDrawMapRect可以因为代码在某处MapKit.framework混淆不易被追溯到他们的调用代码。

取而代之的是,典型的方法是重新阅读他们的文档,直到您对该框架使用该函数的内容有了一个头脑的图像。 (有这样的事,作为反编译的二进制文件,虽然这通常是令人难以接受的,我不建议这样做。)

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

阅读他们的文档后,我推断出这一点。在实际绘制视图之前调用canDrawMapRect框架。如果您没有在您的子类中覆盖该函数,它将调用超类的默认实现,该实现始终返回YES,然后调用drawMapRect:(如果您继承MKOverlayView,则必须覆盖它,否则什么也不会绘制!)

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

因此,长话短说:对于这种情况下,你必须发挥代码侦探,并希望文件写得足够清楚,弄清楚,而无法看到所有的代码。

编辑:只是为了进一步澄清 - 它似乎MKOverlayView必须被分类以实际生成可见的东西。


,我到你的基本问题之前,原来的答案 -

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

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

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

+0

感谢您的回复。那么它们是在.m文件中定义的,但是它们实际上是从哪个项目中调用的? –

+0

是的,但这些只是所有函数的定义......不是第一个必须实际调用的地方,而不仅仅是定义? –

+0

是的,但这是在另一个不被任何地方调用的函数中。换句话说,调用zoomLevelForZoomScale的canDrawMapRect在哪里调用? –