地図のジェスチャー
NMAMapView
クラスは、事前に定義された多数のタッチジェスチャに応答します。 各ジェスチャタイプのマップのデフォルトの動作は、そのまま使用することも、補足することも、完全に置き換えることもできます。 次の表に、使用可能なジェスチャとそのデフォルトの動作の概要を示します。
![]() | 表示されているマップ オブジェクトを選択するには、 1 本の指で画面をタップします。 |
![]() | 地図を一定の大きさでズームするには、 1 本の指で画面を 2 回タップします。 連続的にズームするには、をタップします。 |
![]() | 一定の量をズームアウトするには、 2 本の指で画面をタップします。 連続的にズームするには、をタップします。 |
![]() | 地図を移動するには、 1 本の指を画面に近づけて任意の方向に動かします。 |
![]() | 地図を傾けるには、 2 本の指を水平方向に押し続け、垂直方向に動かします。 地図を画面の中央を中心に回転させるには、 2 本の指を画面に近づけて押し続け、水平方向に動かします。 注 : ピンチ操作または回転操作中に 2 本指でパンすると、地図がチルトまたは回転せずにパンします。 |
![]() | 運動量で地図をパンするには、画面で 1 本の指を押してスワイプします。 地図は同じ方向に移動し続け、停止するまで徐々に減速します。 |
![]() | 連続的にズームインまたはズームアウトするには、 2 本の指を押したまま画面に移動し、その間の距離を増減します。 |
![]() | 地図を回転するには、 2 本の指を画面に近づけて、円で一緒に回転させます。 |
![]() | 1 本の指を押して画面に移動すると、長押しジェスチャーが有効になります。 このジェスチャには、定義済みのマップアクションがありません。 長押しジェスチャのトリガーに必要な時間は |
GitHub での地図ジェスチャの例
この機能を示す例について は、 https://github.com/heremaps/ (Obj-C) および https://github.com/heremaps/ (Swift) を参照してください。
NMAMapView ジェスチャの応答を制御しています
上記のジェスチャは、 enableMapGestures:
および disableMapGestures:
メソッドを使用して、 NMAMapView
インスタンスで選択的に有効または無効にできます。 これらのメソッドは、 NMAMapGestureType
で定義 NMAMapGesture.h
されている値の " または " の組み合わせである単一の入力パラメータを取ります。 特定のジェスチャの状態は、で確認でき isMapGestureEnabled:
ます。
次のコードは、すべてのパンニングジェスチャを無効にする方法を示しています。
// mapView is a valid NMAMapView instance
[mapView disableMapGestures:(NMAMapGestureTypePan | NMAMapGestureTypeTwoFingerPan)];
Recognizers を介したジェスチャの委任
カスタムジェスチャの動作をコード化するもう UIGestureRecognizer
1 つの方法は、でコールバックメソッドを使用することです。 特定のジェスチャの動作を置き換えるには、 NMAMapGesture
デリゲートプロトコルから対応する didReceive...FromRecognizer
ハンドラメソッド NMAMapView usesGestureRecognizers
を YES
に設定して実装します。 この方法では、既定のジェスチャの動作のいずれかを置き換えることができます。 usesGestureRecognizers
が有効になっている場合、前述のように、他の種類のジェスチャの委任が無効になります。
UIGestureRecognizer
は、を使用してジェスチャが認識されたときに、 IT に配信されたすべてのタッチイベントを代行受信します。 NMAMapView
次の例は、タップ処理を置き換える方法を示しています。
@implementation MyGestureDelegate
// ...
-(void)mapView:(NMAMapView *)mapView didReceiveTapFromRecognizer:(UITapGestureRecognizer *)recognizer
{
// Custom gesture behavior
// Information about the gesture is accessed through the recognizer
}
@end
サブビュー
NMAMapView
クラスは、検出されたジェスチャをそのサブビューに渡すことができます。 この問題を解決するには、次の 3 つの条件を満たす必要があります。
- ジェスチャは、サブビューの境界内で発生する必要があります
- サブビューは
NMAMapGestureDelegate
プロトコルを実装する必要があります - サブビューは、検出されたジェスチャのタイプに対応するハンドラ関数を実装する必要があります
サブビューは NMAMapGestureDelegate
ジェスチャを受け取るためにプロトコルを実装する必要がありますが、マップ ビューデリゲートとしてインストールする必要はありません。 ジェスチャが検出されると、マップ ビューはそのジェスチャを処理できるサブビューが存在するかどうかを自動的に検出します。 適切なサブビューが見つかると、ジェスチャが渡され、マップ ビューは何も行いません。
前述のように、マップ ビューは、その子に配信されたすべてのタッチイベントを代行受信します。 したがって、タッチイベントに依存するサブビュー( UIKit
クラスなど)は正しく機能しません。 このようなビューがマップ ビューの上に必要な場合は、子ではなくマップ ビューの兄弟としてビュー階層に配置する必要があります。
MapView
特定のジェスチャタイプの処理を無効にしても、マップ ビューが対応するタッチイベントを受信したり、ジェスチャを検出したり、ジェスチャをサブビューに渡したりすることはありません。