İşaretçi etkinliklerini işleme

Bu örnekte, iki işaretçi içeren bir harita gösterilmektedir. Bir işaretçiye dokunulduğunda kamera, seçilen işaretçiye odaklanmak için yakınlaştırılır ve döndürülür.

Başlayın

Örnek kodu denemeden önce geliştirme ortamınızı yapılandırmanız gerekir. Daha fazla bilgi için iOS için Haritalar SDK'sı kod örnekleri başlıklı makaleyi inceleyin.

Kodu görüntüleme

Swift

import GoogleMaps
import UIKit

final class MarkerEventsViewController: UIViewController {

  private lazy var mapView: GMSMapView = {
    let camera = GMSCameraPosition(latitude: -37.81969, longitude: 144.966085, zoom: 4)
    return GMSMapView(frame: .zero, camera: camera)
  }()

  private var melbourneMarker = GMSMarker(
    position: CLLocationCoordinate2D(latitude: -37.81969, longitude: 144.966085))

  override func loadView() {
    let sydneyMarker = GMSMarker(
      position: CLLocationCoordinate2D(latitude: -33.8683, longitude: 151.2086))
    sydneyMarker.map = mapView
    melbourneMarker.map = mapView
    mapView.delegate = self
    view = mapView
  }
}

extension MarkerEventsViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
    if marker == melbourneMarker {
      return UIImageView(image: UIImage(named: "Icon"))
    }
    return nil
  }

  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
    // Animate to the marker
    CATransaction.begin()
    CATransaction.setAnimationDuration(3)
    let camera = GMSCameraPosition(target: marker.position, zoom: 8, bearing: 50, viewingAngle: 60)
    mapView.animate(to: camera)
    CATransaction.commit()

    // Melbourne marker has a InfoWindow so return false to allow markerInfoWindow to
    // fire. Also check that the marker isn't already selected so that the InfoWindow
    // doesn't close.
    if marker == melbourneMarker && mapView.selectedMarker != melbourneMarker {
      return false
    }
    return true
  }
}
      

Objective-C

#import "GoogleMapsDemos/Samples/MarkerEventsViewController.h"

#import <QuartzCore/QuartzCore.h>

#import <GoogleMaps/GoogleMaps.h>

@implementation MarkerEventsViewController {
  GMSMapView *_mapView;
  GMSMarker *_melbourneMarker;
  BOOL _rotating;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-37.81969
                                                          longitude:144.966085
                                                               zoom:4];
  _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];

  GMSMarker *sydneyMarker = [[GMSMarker alloc] init];
  sydneyMarker.position = CLLocationCoordinate2DMake(-33.8683, 151.2086);
  sydneyMarker.map = _mapView;

  _melbourneMarker = [[GMSMarker alloc] init];
  _melbourneMarker.position = CLLocationCoordinate2DMake(-37.81969, 144.966085);
  _melbourneMarker.map = _mapView;

  _mapView.delegate = self;
  self.view = _mapView;
}

#pragma mark - GMSMapViewDelegate

- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
  if (marker == _melbourneMarker) {
    return [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Icon"]];
  }

  return nil;
}

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
  GMSCameraPosition *camera = [[GMSCameraPosition alloc] initWithTarget:marker.position
                                                                   zoom:8
                                                                bearing:50
                                                           viewingAngle:60];
  // Animate to the marker
  [CATransaction begin];
  [CATransaction setAnimationDuration:3.f];  // 3 second animation
  [CATransaction setCompletionBlock:^{
    if (_rotating) {  // Animation was interrupted by orientation change.
      [CATransaction
          setDisableActions:true];  // Disable animation to avoid interruption from rotation.
      [_mapView animateToCameraPosition:camera];
    }
  }];

  [mapView animateToCameraPosition:camera];
  [CATransaction commit];

  // Melbourne marker has a InfoWindow so return NO to allow markerInfoWindow to fire. Also check
  // that the marker isn't already selected so that the InfoWindow doesn't close.
  if (marker == _melbourneMarker && mapView.selectedMarker != _melbourneMarker) {
    return NO;
  }

  // The Tap has been handled so return YES
  return YES;
}

- (void)viewWillTransitionToSize:(CGSize)size
       withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
  _rotating = true;
  [coordinator
      animateAlongsideTransition:nil
                      completion:^(
                          id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
                        _rotating = false;
                      }];
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

@end
      

Tam örnek uygulamayı yerel olarak çalıştırma

iOS için Haritalar SDK'sı örnek uygulaması, GitHub'dan indirme arşivi olarak edinilebilir. iOS için Haritalar SDK'sı örnek uygulamasını yüklemek ve denemek için aşağıdaki adımları uygulayın.

  1. Örnekler deposunu yerel bir dizine klonlamak için git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git komutunu çalıştırın.
  2. Bir terminal penceresi açın, örnek dosyaları klonladığınız dizine gidin ve GoogleMaps dizinine inin:

    Swift

    cd maps-sdk-for-ios-samples/GoogleMaps-Swift
    open GoogleMapsSwiftXCFrameworkDemos.xcodeproj

    Objective-C

    cd maps-sdk-for-ios-samples-main/GoogleMaps
    open GoogleMapsDemos.xcodeproj
  3. Xcode projesinde File (Dosya) > Add Package Dependencies'e (Paket Bağımlılıkları Ekle) gidin. URL olarak https://github.com/googlemaps/ios-maps-sdk girin, paketi çekmek için Enter tuşuna basın ve Paket Ekle'yi tıklayın.
  4. Xcode'da, derleme düğmesine basarak mevcut şemayla uygulamayı oluşturun. Derleme, Swift için SDKConstants.swift dosyasında veya Objective-C için SDKDemoAPIKey.h dosyasında API anahtarınızı girmenizi isteyen bir hata oluşturur.
  5. iOS için Haritalar SDK'sının etkinleştirildiği projenizden API anahtarı alın.
  6. Swift için SDKConstants.swift dosyasını veya Objective-C için SDKDemoAPIKey.h dosyasını düzenleyin ve API anahtarınızı apiKey veya kAPIKey sabitinin tanımına yapıştırın. Örneğin:

    Swift

    static let apiKey = "YOUR_API_KEY"

    Objective-C

    static NSString *const kAPIKey = @"YOUR_API_KEY";
  7. SDKConstants.swift dosyasında (Swift) veyaSDKDemoAPIKey.h dosyasında (Objective-C), kullanıcı tanımlı sorunu kaydetmek için kullanıldığından aşağıdaki satırı kaldırın:

    Swift

    #error (Register for API Key and insert here. Then delete this line.)

    Objective-C

    #error Register for API Key and insert here.
  8. Projeyi oluşturup çalıştırın. iOS simülatör penceresi açılır ve Haritalar SDK'sı Demoları listesi gösterilir.
  9. iOS için Haritalar SDK'sının bir özelliğini denemek üzere gösterilen seçeneklerden birini belirleyin.
  10. GoogleMapsDemos'un konumunuza erişmesine izin vermeniz istenirse İzin ver'i seçin.