iOS 開発者ガイド for SDK

地図のジェスチャー

NMAMapView クラスは、事前に定義された多数のタッチジェスチャに応答します。 各ジェスチャタイプのマップのデフォルトの動作は、そのまま使用することも、補足することも、完全に置き換えることもできます。 次の表に、使用可能なジェスチャとそのデフォルトの動作の概要を示します。

表示されているマップ オブジェクトを選択するには、 1 本の指で画面をタップします。
地図を一定の大きさでズームするには、 1 本の指で画面を 2 回タップします。 連続的にズームするには、をタップします。
一定の量をズームアウトするには、 2 本の指で画面をタップします。 連続的にズームするには、をタップします。
地図を移動するには、 1 本の指を画面に近づけて任意の方向に動かします。
地図を傾けるには、 2 本の指を水平方向に押し続け、垂直方向に動かします。

地図を画面の中央を中心に回転させるには、 2 本の指を画面に近づけて押し続け、水平方向に動かします。

注 : ピンチ操作または回転操作中に 2 本指でパンすると、地図がチルトまたは回転せずにパンします。
運動量で地図をパンするには、画面で 1 本の指を押してスワイプします。 地図は同じ方向に移動し続け、停止するまで徐々に減速します。
連続的にズームインまたはズームアウトするには、 2 本の指を押したまま画面に移動し、その間の距離を増減します。
地図を回転するには、 2 本の指を画面に近づけて、円で一緒に回転させます。

1 本の指を押して画面に移動すると、長押しジェスチャーが有効になります。 このジェスチャには、定義済みのマップアクションがありません。

長押しジェスチャのトリガーに必要な時間は NMAMapView longPressDuration 、プロパティを使用してカスタマイズできます。 このプロパティのデフォルト値は 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)];

ジェスチャーの委任

カスタムマップジェスチャの動作の場合 NMAMapView、ジェスチャデリゲートがのインスタンスにインストールされている可能性があります。 デリゲートは gestureDelegate プロパティを介してアクセスさ NMAMapGestureDelegate れ、プロトコルを実装する必要があります。 特定のジェスチャの動作を置き換えるには、プロトコルの対応するハンドラメソッドを実装する必要があります。 この方法では、デフォルトのジェスチャの動作のいずれかまたはすべてを置き換えることができます。 NMAMapView 次の例は、タップ処理を置き換える方法を示しています。

// mapView is an instance of NMAMapView
// myGestureDelegate is an instance of the custom gesture handling class
mapView.gestureDelegate = myGestureDelegate;
// In the MyGestureDelegate class definition:
@interface MyGestureDelegate : NSObject <NMAMapGestureDelegate>
@implementation MyGestureDelegate
// ...
-(void)mapView:(NMAMapView*)mapView didReceiveTapAtLocation:(CGPoint)location
{
  // Custom gesture behavior
  // Tap location is available through the "location" parameter
}
@end

特定のジェスチャタイプのカスタム動作に加えて、既定の動作が必要な場合は、そのタイプのデリゲートハンドラメソッドが NMAMapView 既定のハンドラ defaultGestureHandler で適切なメソッドを呼び出す必要があります。 例 : カスタムのタップ処理メソッドから既定のタップジェスチャ処理動作を使用する方法を次の例に示します。

-(void)mapView:(NMAMapView *)mapView didReceiveTapAtLocation:(CGPoint)location
{
  // Some custom behaviour...
  [mapView.defaultGestureHandler mapView:mapView didReceiveTapAtLocation:location];
  // More custom behaviour...
}

カスタムジェスチャデリゲートによって処理されないジェスチャタイプも、既定の動作をトリガします。

注 : NMAMapView 特定のジェスチャタイプの処理を無効にすると、同じジェスチャタイプのデリゲート処理も無効になります。

Recognizers を介したジェスチャの委任

注 : バージョン 2.1 では、これらのタイプのハンドラメソッドは廃止されました。 前のセクションで説明したデリゲートハンドラメソッドに移行することをお勧めします。

カスタムジェスチャの動作をコード化するもう UIGestureRecognizer1 つの方法は、でコールバックメソッドを使用することです。 特定のジェスチャの動作を置き換えるには、 NMAMapGesture デリゲートプロトコルから対応する didReceive...FromRecognizer ハンドラメソッド NMAMapView usesGestureRecognizersYES に設定して実装します。 この方法では、既定のジェスチャの動作のいずれかを置き換えることができます。 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 つの条件を満たす必要があります。

  1. ジェスチャは、サブビューの境界内で発生する必要があります
  2. サブビューは NMAMapGestureDelegate プロトコルを実装する必要があります
  3. サブビューは、検出されたジェスチャのタイプに対応するハンドラ関数を実装する必要があります

サブビューは NMAMapGestureDelegate ジェスチャを受け取るためにプロトコルを実装する必要がありますが、マップ ビューデリゲートとしてインストールする必要はありません。 ジェスチャが検出されると、マップ ビューはそのジェスチャを処理できるサブビューが存在するかどうかを自動的に検出します。 適切なサブビューが見つかると、ジェスチャが渡され、マップ ビューは何も行いません。

前述のように、マップ ビューは、その子に配信されたすべてのタッチイベントを代行受信します。 したがって、タッチイベントに依存するサブビュー( UIKit クラスなど)は正しく機能しません。 このようなビューがマップ ビューの上に必要な場合は、子ではなくマップ ビューの兄弟としてビュー階層に配置する必要があります。

注 : MapView 特定のジェスチャタイプの処理を無効にしても、マップ ビューが対応するタッチイベントを受信したり、ジェスチャを検出したり、ジェスチャをサブビューに渡したりすることはありません。