Путаница с MKOverlayView - PullRequest
       13

Путаница с MKOverlayView

1 голос
/ 26 июля 2011

Я работал со слоями для MapKit на iPhone, и одна библиотека, с которой я столкнулся, была такой: https://github.com/mtigas/iOS-MapLayerDemo/. Это очень полезно и, кажется, работает нормально. Тем не менее, я пытаюсь понять и понять, как это работает, но у меня возникли некоторые проблемы.

На этой странице, например: https://github.com/mtigas/iOS-MapLayerDemo/blob/master/MapLayerDemo/Classes/CustomOverlayView.m, вверху определены 4 пользовательские функции. Я предполагаю, что эти функции дополняют обычные функции MKOverlayView? Дело в том, что я не могу найти, где любая из этих новых функций на самом деле вызывается из , и поэтому у меня возникают некоторые затруднения с пониманием, как работает эта страница. Похоже, что это не из других файлов в проекте.

Я ценю любую помощь, спасибо.

1 Ответ

3 голосов
/ 26 июля 2011

После некоторого расширенного обсуждения с вами в комментариях:

Перезаписываемые функции 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 ++ эквивалент будет просто объявить функции приватные)

3 из этих 4 функций вызываются в том же файле .m. Без копаться, я думаю, они написали первую функцию, а затем позже решил не использовать его.

...