iOSでYandex MapKitを曎新した方法、たたはマップ、お金、2぀のマップピットの物語

たえがき





はじめたしお 、この蚘事の目的を簡単に説明したす。iOSモバむルクラむアントでYandexマップを曎新たたは埋め蟌む必芁がある堎合に時間を節玄し、経隓を共有したいずいう欲求。



電子メヌルカヌド個人甚ではなく、ビゞネスのみの代わりに、YandexMapkitアプリケヌション2017幎10月頃を組み蟌みたした。 箄3か月埌、矎しい冬の日に、キヌのせいでカヌドのアンドロむド版が2日目に故障したした。カヌドはカボチャになっただけです。 iOSクラむアントずしお、これは圱響したせんでした。 アンドロヌドの貧しい人々...今回は、圌らは䜕の関係もありたせんでした。 圓時、倚くのロッゞが倒れたした ロシアのポスト、カモノハシ、倚分あなたたちは芚えおいたすか







これは、アプリケヌションがサヌドパヌティのサヌビスに関連付けられおいる堎合、たずえば、Appleのカヌドの実装を以前のバヌゞョンに切り替えお、別のカヌドに眮き換えるのではなく、この堎合のプラン「B」があるず䟿利だずいうこずです...



さらに3か月埌、3月のどこかで、Yandexから、最終的にSDKを曎新したずいう手玙が届きたした前の曎新から玄4〜5幎埌。

「-曎新、1幎で叀いものをオフにする」、芁するに。 その前に、単に叀いバヌゞョン1.0がありたした







たあ、もちろん、そのような譊告の埌、私たちは匕っ匵らず、すぐに移行を開始したした... 3月埌8月に。



「コメント」の段階機胜の無効化



あなたは私に蚀った、ハ...そこで曎新されるもの、ポッドが曎新される、いく぀かの堎所を修正する、それだけです。 いいえ、新しいマップAPIは叀いものず完党に互換性がありたせん。さらに、埌で刀明したように、叀いバヌゞョンや他のカヌドラむブラリにはすぐに䜿甚できる重芁な必需品もたくさんありたす。



したがっお、mapkit 3.0蚘事の執筆䞭にバヌゞョン3.1がリリヌスされたした、 ドキュメントぞのリンクです。



そしお、なぜYandexからの譊告に加えお 䞀方、Xcode 10のベヌタ版では、叀いバヌゞョンのクゞラを䜿甚したプロゞェクトは、C ++が内郚のどこかで䜿甚されおおり、新しいバヌゞョンでは非難されおいるため、愚かには行きたせん。 サブリストで名前を倉曎する必芁があり、そこで曎新するこずさえ必芁です。芁するに、結局は曎新する必芁があるので、私はこれをしたせんでした。



1バヌゞョン1.0ではなく、すぐに3.0にSDKを曎新したす。もちろんAPIは倉曎されたしたが、...



そのため、叀いYMKAnnotation Protocolは単玔に欠萜しおいたす









迅速に、それは匷制鍛造strigのように芋えたすそれは賑やかではなく、「」蚘号はあなたのためにそのように扱われたす...プロトコル実装の䟋







さお、私たち自身で、座暙メ゜ッドの代わりにプロパティを䜜成したす。すべおがシンプルで、メ゜ッドは冗長です。 titleは未圢成のタむトルに眮き換えられたすが、䞀方で、プロパティを䜜成するこずもできたす。プロゞェクトを倉曎する必芁がある堎所がたくさんあるので、感嘆笊を削陀したした。



プロゞェクトでは、Yandex MapPocketヘッダヌのいずれにもむンポヌトされないため、3぀のコントロヌラヌを数回亀換し、別のコントロヌラヌにCoreLocationをむンポヌトする必芁がありたした。



プロゞェクト党䜓で䜿い慣れたYMKMapCoordinate叀いクゞラの名前を倉曎しないように、YMKPoint新しいクゞラのタむプ゚むリアスを䜜成したした







2たた、マップを操䜜するために将来必芁になるいく぀かのプロパティ、䞻にゲッタヌを宣蚀したしょう







3最初に䜜成するのはYMKMapViewですすべお問題ありたせん。そのようなオブゞェクトはただ利甚可胜です。 以前、私はすぐにそれを初期化したした、今あなたはこれをするこずができたせん、最初にキヌを眮く必芁があるので、それはクラッシュしたす 珟圚のキヌは機胜しないため、新しいキヌを芁求する必芁がありたす。 ドキュメントに埓っお、AppDelegateに远加したす。 キヌを蚭定した埌にのみ、YMKMapViewを䜜成し、setupMapメ゜ッドで必芁な方法で構成できたす。







ここで䜕が起こるか、埌ほど適切な蚭定が必芁になる過皋で詳现に分析したす



4次は䜕ですかそしお、CLLocationの初期䜍眮がありたしたが、それを䜿甚するには、CoreLocationフレヌムワヌクを手動で远加するか、たたは...たたはYandex mapkitのYMKPointで眮き換える必芁がありたす







5さらに、マップはこの座暙を䞭心に非垞に簡単な方法で配眮されたしたが、珟圚は単玔な方法はありたせん







しかし、もう少し耇雑で少し深いマップオブゞェクトがありたす... mapView.mapWindow.map.Move。 ここでは、YMKCameraPositionなどのオブゞェクトの存圚に぀いお孊習したす。







6次に、そのようなapi /プロパティがないため、マップ構成にコメントしたす。 少なくずも最小限に開始するために、ここでは省略したす。



泚釈の远加に぀いおコメントしたすこれは暙準の機胜であるこずに泚意したす。たた、最も近いポむントの衚瀺に぀いおもコメントしたすこれは既に䜕らかの機胜です。



たた、YMKMapViewDelegate党䜓も解説です。これは、新しいフレヌムワヌクでは芋぀けられたせんでしたが、同様の類䌌物でもありたす。







実装は省略し、メ゜ッド自䜓のみを省略したした。



-ナヌザヌの䜍眮を衚瀺するかどうか、

-ピンに䜿甚するビュヌ、

-泚釈をクリックしたずきの反応、

-泚釈のコヌルアりト、

-コヌルアりトをクリックしたずきの反応、぀たり、通垞䜿甚するすべお。 結局、ある皮のAPIカヌドを䜿甚する䜕らかの方法がありたした。



すべおがMapVCで蚈算されたした-これは、マップキットが䜿甚されたメむンクラスです



7カスタムコヌルアりトに関する少しのコメント。YMKCalloutViewを継承したせん。新しいクゞラにはもうありたせん。



ほら、プロゞェクトが集たったので、私はすべおを始めお...箱の䞭のノヌトブックを芋るこずができたした。開始埌、あなたは「りォヌムアップ」する時間を䞎える必芁があるためしかし、私はそれに぀いお知らず、䜕かがそうではないず思ったそのため、キヌをアクティブにするのに時間がかかるこずを提案したしたが。 仮定が正しいこずが刀明したした。 箄1時間埅぀必芁がありたす倚分䜕かが倉わったのかもしれたせん。



叀いAPIを新しい方法で倉曎しようずするず、マップが衚瀺されたした。



ステヌゞ2-「怜玢」叀い方法を新しい方法で実装する方法



倱われた機胜の埩元を始めたしょう。 そのため、ナヌザヌロックを衚瀺する必芁がありたすが、以前の方法ではプロパティを倉曎しおデリゲヌトを蚭定するだけではできたせん。



これはレむダヌを介しお行われたす。setupMapメ゜ッドポむント3を参照しおください。







デモの䟋 Yandex githubからダりンロヌド があるので、芋おみたしょう 。 ずころで、setAnchorWithに泚意する必芁がありたす。 埌で説明したすが、ズヌムに関連しおいたす。 わかりたした堎所は動䜜したす。



2次はもちろん、泚釈です。 叀い方法で远加するこずはできたせん。もう䞀床デモをご芧ください。 そこにクラスがありたす-MapObjectsViewController。 新しいバヌゞョンでは、ピンをマップに远加するためにデリゲヌトは必芁ありたせん。そのため、mapObjectsプロパティにアクセスし、オブゞェクトでaddPlacemarkメ゜ッドを呌び出し、そこに座暙を枡す必芁がありたすただ他のオヌバヌロヌドがありたす䟋







アノテヌションのコレクションを反埩凊理したずえば、サヌバヌから受信した埌、マップに远加したす。 ちなみに、このメ゜ッドは「placeMark」プレヌスラベルを返したす。これは、たずえばzIndexプロパティを䜿甚しお衚瀺順序を倉曎するなど、远加の蚭定を行うために䜿甚できたす。



しかし、ここで、私は前に登っお代理人を探しお、圌を安党に芋぀けるこずができず、単䞀の代理人ではなかったずいう点を逃したした実際、圌らは単に別の名前で呌ばれ始めたした、今では圌らはリスナヌです。 Appleクゞラず叀いYandexクゞラの以前の経隓から、セルず同様に泚釈が再利甚されるこずを知っおいたすが、デモにはaddPlacemarkしかありたせん。 Yandex-cardsのリヌドに぀いおの質問小さな個人的な知り合いが助けた「-メモリ䜿甚量を最適化する方法、オブゞェクトを再利甚する方法」



泚1Yandex.Mapsはマップキットを䜿甚し、開発しないこずに泚意するこずが重芁です。 これは、マップキットチヌムによっお行われたすハブのニコラむのニックネヌム-likhogrud @。



2オブゞェクトが再利甚されない理由の説明



叀いクゞラでは、annotationViewsはビュヌであり、ナヌザヌによっお䜜成されたした。もちろん、䜜成は安䟡ではないため、ビュヌを再利甚する必芁がありたす。 新しいクゞラでは、オヌプンGLで盎接マップキットによっお目印が䜜成されたす。 そしお、そこで再利甚されるかもしれたせんが、これは䞍正確です。 いずれにせよ、これはビュヌを䜜成するよりもはるかに効率的です。



3新しいものから、ずころで、ナヌザヌの泚釈アむコンを倉曎する可胜性がありたす。 次のように実装したす。リスナヌデリゲヌトのアナログを远加し、適切なプロトコルを実装する必芁がありたす-3぀のメ゜ッドのうち1぀、2぀だけを空のたたにしたす。



同時に、目印をアむコンで再読み蟌みしたす。







たた、アンカヌのプロパティに泚目したす。 地図䞊のナヌザヌの䜍眮ボタンをクリックするず、カメラは䜍眮の䞭心にフォヌカスを移動したす。 しかし、問題は、もう䞀床アクションを抌しおも生成されないこずです。 なに アンカヌメ゜ッドに぀いおコメントするず、すべおが機胜したす。



4クリックを解決するために、それぞれコヌルアりトを衚瀺する必芁がありたす。 むンタヌフェヌスにはいく぀かのメ゜ッドがありたすが、正しいメ゜ッドはYMKMapObjectTapListenerです。 埌で自分自身を苊しめなければならなかった重芁な興味深い方法が1぀ありたす。サブスクラむバが芋぀かった堎合にさらに統合しないようにtrueを返したす。 私はあなたの泚意を匕きたす、あなたは最初にサブスクラむブする必芁がありたす、mapObjectsはサブスクラむブされたす149行目。











したがっお、クリックは満たされたす。 やったヌ それでも、可芖ゟヌンにのみピンを衚瀺する詊みがありたしたが、これは䞍芁であり、䞀床にすべおを衚瀺するため、そのたたにしおおきたすスロヌダりンしないため



5それから、私は䟿利のためにボタンを拡倧/瞮小させたかった。 堎所ボタンずの類掚による小さなコピヌアンドペヌストず線集、そしお完了です。



さらに、カメラに぀いお知っおいるので、必芁に応じおmoveメ゜ッドを䜿甚し、それに応じお珟圚のズヌム+-1たたは0.5を䜿甚したす。 ここですべおが順調です。







6䞻な機胜-コヌルアりトこれは远加情報のある長方圢で、䞋郚に䞉角圢がありたすを参照したす。 APIがないこずがわかりたした「倏には酔わせる」-この蚘事を手動で入力しないように、リヌフレットからメモを読んだずきにYandexが私のスピヌチを認識したした。







元気ですか 100 500アプリケヌションはコヌルアりトを䜿甚したす。



私たちは、「テクニカルサポヌト」Kolyaでこれを手動で行う方法をよく曞いおいたす。 あなたのオプションは䜕ですか



ビュヌを画像に倉換したす 3.1でファむルを远加したビュヌを盎接远加するこずはできないため、アむコンを倉曎したす...







これらの束葉杖は平地で手に入れられたようです。

実際、束葉杖ではなく、もちろん、基本的な機胜を考慮するだけで䞍圚です。



7さお、最初にテストコヌルアりトを远加したしょう。赀い正方圢を䜿甚したす。 そのため、ピンをクリックするず、デリゲヌト/リスナヌメ゜ッドが呌び出され、クリックポむントずオブゞェクトが枡されたす。 トリックを期埅するこずなく、コヌルアりトを远加するポむントずしお「ポむント」を䜿甚したす。 泚意、すべおが正しく行われたした「圌らはクリックし、ポむントを取っお、それを瞛りたしたか」玄80が正しく答え、20はそうではありたせんでした







そしお、メ゜ッド本䜓でshowCalloutヘルパヌメ゜ッドを呌び出したす。







544行目

内郚で、赀色のテストビュヌを40 x 40で䜜成し、それを画像に倉換し、倀0.5の定数xを宣蚀したす。これは、ポむントの䞭倮にコヌルアりト䞉角圢を配眮するために䜿甚されたす。 圌は自分の䜍眮を倉えるずいう考えを拒吊し、埌でカメラを動かしお、遞択されたコヌルアりトが電話スクリヌンの䞭倮に衚瀺されるようにした



次に、tappableAreaの「プッシュ」゚リアを宣蚀したす。ピンのアむコンスタむルにはこのようなプロパティがありたす。 たあ、クリックゟヌンを制限するこずができたす、それを行いたす。 ゟヌンの範囲は0.0〜1.1です。 䞋の郚分が必芁です。ここには、以前に画像に倉換されたボタンがあるず思われたす芚えおおいおください。 さお、ボタンが䞋にあるため、これはゟヌン0,0.5-1.1を意味したす。

ゟヌン制限は機胜したすが、ニュアンスがあり、すべおを無効にしたす。 抌されおいない領域の䞋に別のピンがある堎合、抌すず機胜したす。 この゚リアの意味は クリックが通過しないように、フラグなどを䜜成したすか。 さお...



550ラむン

アむコンのスタむルを䜜成するず、最初のパラメヌタヌでアンカヌの䜍眮をすぐに指定できたす。たずえば、䞋の557行目でした。 䜍眮yは1.05に等しく、䞉角圢をピンの䞊に再び垂盎に䞊げたす



559ラむン

特定のサむズのカスタムコヌルアりトを䜜成し、

遞択した泚釈selectedAnnotationからの情報、特にタむトルずサブタむトル、このコヌルアりトのボタンの碑文を䜿甚しお、必芁なフィヌルドを構成したす。 その埌、あなた自身があなたがやりたいこずができたす。 遞択した泚釈は、デリゲヌトで以前に定矩されおいたす。 しかし、今のずころは、以前に䜜成した赀い正方圢を远加したす

次に、ピンをmapObjectsコレクションに远加したす。メ゜ッドは远加された目印を返し、倉数に保存したす。

コヌルアりト自䜓をクリックするず、詳现なコントロヌラヌが開くため、ポップアップの䞋に別のピンが入力され、デリゲヌトがそれに入るず、デリゲヌトが再び機胜するため、ここでzIndexを䜿甚しお階局内の順序を倉曎する必芁がありたす。 可芖性を蚭定し、コヌルアりトを564行目の䞭倮に移動したす



ニュアンス 倉数目印は、コヌルアりトぞのポむンタヌです。

最初はピンがありたせん。ピンをクリックするず衚瀺されたす。次のピンをクリックした埌、最初のコヌルアりトを削陀しお新しいコヌルアりトを远加する必芁がありたす。 したがっお、倉数placemark= Nilの堎合、mapObjectsコレクションから叀いコヌルアりトを削陀する必芁がありたす







たた、カヌドのタパスの堎合、コヌルアりトを非衚瀺にする必芁があるため、デリゲヌトメ゜ッドで目印を割り圓お、オブザヌバヌが機胜し、コヌルアりトが削陀され、遞択した泚釈がクリアされたす



このため、以前にYMKMapInputListenerにサむンアップしたした







次に、ビュヌを倉換する方法は次のずおりです。 バヌゞョン3.1では、マップにビュヌを远加する機胜が远加されたした

ビュヌの実行方法に぀いおは説明したせんが、これに倚くの問題可胜性のある䞉角圢がある堎合は、このステヌゞを远加したす。







䞋の䞉角圢の䞋にある堎所には、高さに远加された魔法20が必芁です。



たた、特定の堎所巊、右、䞭倮のピンにポップアップをポップアップアタッチする必芁がありたす。これには、アンカヌプロパティがありたす。 次のように定矩されたす

マップの可芖領域を3぀の垂盎ゟヌンに分割し、どのゟヌンにいるかを刀断し、それに応じおバむンディングの䜍眮を倉曎したす。 コヌド䟋では、巊偎にあるかどうかを確認したす。同様に、䞭倮にある堎合、巊偎にない堎合ず䞭倮にない堎合、右偎のポむントは







ポむントが領域に該圓するかどうかを確認するヘルパヌ関数







スタヌト。 動䜜したす。 しかし、埮劙な違いがありたす。ズヌムしようずしおいるようです。1、2、3、そしおコヌルアりトはピンから飛び出したす。 なに どうやっお







7デバッグを開始したす。座暙は同じです







その埌、䜕が起こっおいるのか、どのように機胜するのかを理解しようず詊み、デモに戻り、さらに泚意深い違いの怜玢を行いたした...







私は、座暙が盎接送信され、tapuのものではないこずに気付きたした しかし、結局のずころ、私は、座暙が同じであるこず、぀たり、円ず正方圢の座暙が同じであるこずは明らかです。

そのため、メ゜ッドではオブゞェクトにすぐにアクセスせず、ポむントを枡したしたが、これは正しくありたせん。







しかし、オブゞェクトをキャストし、プロパティを取埗する必芁がありたすすべおが異なる方法で呌び出されるすべおの堎所で、ここで珟圚のゞオメトリを調敎しおからポむントするは、この皮のクリ゚むティブなのですか 493行







同じピンを繰り返しクリックした堎合、最初のピン留め、2番目のコヌルアりト、およびクリックを凊理しないずいう2぀の抌すオプションを凊理する必芁があるため、 最初に行うこずは、ピンコレクションでクリックしたピンを芋぀けるこずです495行を調敎したす。それ以倖の堎合はtrueを返したす。これにより、クリックを凊理し、階局をさらに進める必芁がないず蚀いたす。



次に 、ピンたたはコヌルアりトをクリックしお、499行ラベルの座暙を比范したす。 同等性テスト







さらに、これがコヌルアりトであり、領域党䜓ではなくボタンクリックに応答するたたは、珟圚は画像であるために暡倣する堎合は、ペンでいく぀かの蚈算を行う必芁がありたす:)



  1. 䞖界座暙を画面501行に倉換する

    私たちは自分自身を考慮したすマップ座暙を画面䞊に倉換し、珟圚䜍眮を確認し、ビュヌの幅ず高さを远加するこずでコヌナヌポむントを取埗したすが、䜕らかの理由でそれらが䞀臎せず、手動で3倍したす私の堎合は10番目のiPhone。 埌で刀明したように、私は忘れおおり、ポむントあたりのピクセル数を考慮したせんでした。 1x1ポむント1ピクセル、2x、3x 1ポむントは3ピクセルです。
  2. ボタンの高さ-コヌルアりトの高さ+䞉角圢の高さ、スケヌル、スケヌルに関する情報行498を蚈算したす。 次に、ボタンの高さがコヌルアりトの高さの半分であるため、これをすべお2぀に分割したす。
  3. 次に、アンカヌx0.5、y1に基づいお、角床の座暙を蚈算したす。䞉角圢のスケヌルず面積が䞎えられたす
  4. 次に、これらの画面座暙を䞖界に倉換したす
  5. それらに基づいお衚瀺領域を䜜成したす。ボタンゟヌンです
  6. そしお、ボタンゟヌンにヒットしたかどうかを確認したす。 ヒットしたら、泚釈のタむプを確認し、タむプに応じお、いく぀かのメ゜ッドを呌び出したす。詳现画面に移動するか、StorePointを䜿甚する堎合の配信甚にこのストアを遞択したす


それ以倖の堎合は、ピンをクリックするだけで、実際に䞊蚘で行ったコヌルアりトを远加する必芁がありたす。



以䞊で、新しいクゞラずの最初の知り合いは終わりたした。



他に蚀いたいのは、珟圚のmappitマップの実装には䜿甚されおいない倚くの機胜が含たれおいるこずです。これは、結果のバむナリのサむズにも圱響したす。 あなたはそのような犠牲の準備ができおいたすか、将来的に、みんなは結局モゞュヌルに取り壊されるべきです。 たた、ワヌクショップのアンドロむドの同僚から、Kotlinずの互換性に問題があるず聞きたした。



远䌞 私が蚘事を曞き始めたずき、䞊蚘の問題が解決され実装されたアップデヌト3.1が発衚されたした。



远加したした



Androidの堎合、arm64およびx86ビルドが登堎したした。

任意のViewオブゞェクトをマップに远加できたす。

自転車ルヌティングが登堎したした。

Androidにnullableアノテヌションを远加したした。



倉曎された



MapKitはいく぀かの郚分に分かれおいたす。

MapKit-マップのみ。

MapKitルヌト-車のルヌティング;

MapKit Transport-歩行者ルヌト、公共亀通ルヌト、自転車ルヌト。

MapKit Search-怜玢ずゞオコヌディング。

MapKit Places-パノラマ。

iOSの堎合、null可胜泚釈はより厳栌になりたした。



修正枈み



倚くのバグが修正されたした。

パフォヌマンスの改善。



tech.yandex.ru/maps/doc/mapkit/3.x/concepts/versions-docpage



コメント、質問を曞いおください。



All Articles