1

私は iPhone で MapKit のレイヤーを扱ってきましたが、私が見つけたライブラリの 1 つは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 に答える