2011-07-26 276 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在哪裏調用? –