0

GoogleマップSDKを使用してマップをレンダリングするIOSアプリを開発しています。私は実際にマップのレンダリングを処理する別のView Controllerを含むView Controllerを持っています。私が達成したいのは、ユーザーがマップカメラを動かしてタッチを終了した後に何らかのアクションを実行することです。この特定のケースに最適なオプションは、touchesEnded:withEvent: メソッドをオーバーライドすることであることがわかりました。含まれているView Controller内でこのメソッドをオーバーライドしていますが、何らかの理由で起動されていません。私の問題の原因は何ですか?

ところで mapView:idleAtCameraPosition: ユーザーが画面に触れたときにアクションを実行する必要があるため、私の要件に適合しません (マップの移動を停止します)

ここにいくつかのコードがあります。google maps SDK for IOS で提供されている例と基本的に同じです

インターフェース

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>

@interface MTMapViewController : UIViewController <CLLocationManagerDelegate, GMSMapViewDelegate>

@property (nonatomic, strong) CLLocationManager *manager;

@end

実装

#import "MTMapViewController.h"
#import <GoogleMaps/Googlemaps.h>
#import <CoreLocation/CoreLocation.h>

@implementation MTMapViewController {
    GMSMapView *mapView_;
    GMSMarker *marker;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}


- (void)loadView {
    [super loadView];
    mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:nil];
    mapView_.delegate = self;
    mapView_.myLocationEnabled = YES;
    mapView_.mapType = kGMSTypeNormal;
    mapView_.settings.myLocationButton = YES;
    mapView_.settings.compassButton = YES;
    self.view = mapView_;
    self.manager = [[CLLocationManager alloc] init];
    self.manager.delegate = self;
    [self.manager startUpdatingLocation];
    marker = [[GMSMarker alloc] init];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    [manager stopUpdatingLocation];
    CLLocation *currentLocation = [self.manager location];
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithTarget:currentLocation.coordinate
                                                               zoom:17];
    mapView_.camera = camera;
    marker.position = currentLocation.coordinate;
    marker.icon = [UIImage imageNamed:@"passenger_marker.png"];
    marker.map = mapView_;
}

- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position {
    marker.position = position.target;
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
    NSLog(@"mapView:idleAtCameraPosition fired");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    //This wont be invoked
    NSLog(@"touchesEnded:withEvent: fired");
}

@end

ご協力ありがとうございました

4

1 に答える 1

1

注意してください idleAtCameraPosition は、指を離したときではなく、マップの移動が停止したときです。

GSMapView をサブクラス化し、PanGestureRecognizer >> State ENDED を追加して、指が離されたときに取得する必要がありました。

https://github.com/clearbrian/GoogleMapiOS_TapEndedGesture

于 2014-02-21T12:45:45.457 に答える