İşaretçiler

Platform seçin: Android iOS JavaScript

İşaretçiler, haritadaki tek konumları gösterir.

İşaretçiler varsayılan olarak, genel Google Haritalar görünümüne ve tarzına sahip standart bir simge kullanır. İşaretçinizi özelleştirmek istiyorsanız varsayılan işaretçinin rengini değiştirebilir, işaretçi resmini özel bir simgeyle değiştirebilir veya işaretçinin diğer özelliklerini değiştirebilirsiniz.

İşaretçideki bir tıklama etkinliğine yanıt olarak bilgi penceresi açabilirsiniz. Bilgi penceresi, işaretçinin üzerindeki bir iletişim kutusunda metin veya resim gösterir. Metin görüntülemek için varsayılan bir bilgi penceresi kullanabilir veya içeriğini tamamen kontrol etmek için kendi özel bilgi pencerenizi oluşturabilirsiniz.

İşaretçi ekleme

İşaretçi eklemek için position ve title içeren bir GMSMarker nesnesi oluşturun ve map değerini ayarlayın.

Aşağıdaki örnekte, mevcut bir GMSMapView nesnesine nasıl işaretçi ekleneceği gösterilmektedir. İşaretçi 10,10 koordinatlarında oluşturulur ve tıklandığında bir bilgi penceresinde "Hello world" dizesini gösterir.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.title = "Hello World"
marker.map = mapView
      

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @"Hello World";
marker.map = mapView;
      

marker.appearAnimation özelliğini aşağıdaki değerlere ayarlayarak haritaya yeni işaretçi ekleme işlemini animasyonlu hale getirebilirsiniz:

  • İşaretçinin eklendiğinde groundAnchor öğesinden çıkmasını sağlamak için kGMSMarkerAnimationPop.
  • kGMSMarkerAnimationFadeIn, işaretçinin eklendiğinde belirginleşmesini sağlar.

İşaretçiyi kaldırma

GMSMarker öğesinin map özelliğini nil olarak ayarlayarak haritadan bir işaretçiyi kaldırabilirsiniz. Alternatif olarak, GMSMapView clear yöntemini çağırarak haritadaki tüm yer paylaşımlarını (işaretçiler dahil) kaldırabilirsiniz.

Swift

let camera = GMSCameraPosition.camera(
  withLatitude: -33.8683,
  longitude: 151.2086,
  zoom: 6
)
let options = GMSMapViewOptions()
options.camera = camera
let mapView = GMSMapView(options: options)
// ...
mapView.clear()
      

Objective-C

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                        longitude:151.2086
                                                             zoom:6];
GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
options.camera = camera;
mapView = [[GMSMapView alloc] initWithOptions:options];
// ...
[mapView clear];
      

Haritaya eklediğiniz bir işaretçide değişiklik yapmak istiyorsanız GMSMarker nesnesini sakladığınızdan emin olun. Bu nesnede değişiklik yaparak işaretçiyi daha sonra değiştirebilirsiniz.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.map = mapView
// ...
marker.map = nil
      

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.map = mapView;
// ...
marker.map = nil;
      

İşaretçi rengini değiştirme

markerImageWithColor: ile varsayılan simgenin renkli bir sürümünü isteyip elde edilen resmi GMSMarker öğesinin simge mülküne ileterek varsayılan işaretçi resminin rengini özelleştirebilirsiniz.

Swift

marker.icon = GMSMarker.markerImage(with: .black)
      

Objective-C

marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
      

İşaretçi resmini özelleştirme

Varsayılan işaretçi resmini değiştirmek isterseniz işaretçinin icon veya iconView özelliğini kullanarak özel bir simge ayarlayabilirsiniz. iconView ayarlanırsa API, icon özelliğini yoksayar.

İşaretçinin icon özelliğini kullanma

Aşağıdaki snippet, icon özelliğinde UIImage olarak sağlanan özel simgeye sahip bir işaretçi oluşturur. Simge, Londra, İngiltere'de ortalanmış. Snippet, uygulamanızın "house.png" adlı bir resim içerdiğini varsayar.

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: positionLondon)
london.title = "London"
london.icon = UIImage(named: "house")
london.map = mapView
      

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:positionLondon];
london.title = @"London";
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView;
      

Aynı resimle birden fazla işaretçi oluşturuyorsanız işaretçilerin her biri için aynı UIImage örneğini kullanın. Bu, uygulamanızın performansını artırır ve çok sayıda işaretçi gösterilirken doku önbelleği kullanımını optimize eder.

Bu resimde birden fazla kare olabilir. Ayrıca, alignmentRectInsets özelliği de dikkate alınır. Bu özellik, işaretçinin gölgesi veya kullanılamayan başka bir bölgesi varsa kullanışlıdır.

İşaretçinin iconView özelliğini kullanma

Aşağıdaki snippet, işaretçinin iconView özelliğini ayarlayarak özel simgeli bir işaretçi oluşturur ve işaretçinin rengindeki değişikliği animasyonlu olarak gösterir. Snippet, uygulamanızda "house.png" adlı bir resim olduğunu varsayar.

Swift

import CoreLocation
import GoogleMaps

class MarkerViewController: UIViewController, GMSMapViewDelegate {
  var mapView: GMSMapView!
  var london: GMSMarker?
  var londonView: UIImageView?

  override func viewDidLoad() {
    super.viewDidLoad()

    let camera = GMSCameraPosition.camera(
      withLatitude: 51.5,
      longitude: -0.127,
      zoom: 14
    )
    let options = GMSMapViewOptions()
    options.camera = camera
    let mapView = GMSMapView(options: options)
    view = mapView

    mapView.delegate = self

    let house = UIImage(named: "House")!.withRenderingMode(.alwaysTemplate)
    let markerView = UIImageView(image: house)
    markerView.tintColor = .red
    londonView = markerView

    let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
    let marker = GMSMarker(position: position)
    marker.title = "London"
    marker.iconView = markerView
    marker.tracksViewChanges = true
    marker.map = mapView
    london = marker
  }

  func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    UIView.animate(withDuration: 5.0, animations: { () -> Void in
      self.londonView?.tintColor = .blue
    }, completion: {(finished) in
      // Stop tracking view changes to allow CPU to idle.
      self.london?.tracksViewChanges = false
    })
  }
}
      

Objective-C

@import CoreLocation;
@import GoogleMaps;

@interface MarkerViewController : UIViewController <GMSMapViewDelegate>
@property (strong, nonatomic) GMSMapView *mapView;
@end

@implementation MarkerViewController {
  GMSMarker *_london;
  UIImageView *_londonView;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5
                                                          longitude:-0.127
                                                               zoom:14];
  GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init];
  options.camera = camera;
  _mapView = [[GMSMapView alloc] initWithOptions:options];
  self.view = _mapView;

  _mapView.delegate = self;

  UIImage *house = [UIImage imageNamed:@"House"];
  house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  _londonView = [[UIImageView alloc] initWithImage:house];
  _londonView.tintColor = [UIColor redColor];

  CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
  _london = [GMSMarker markerWithPosition:position];
  _london.title = @"London";
  _london.iconView = _londonView;
  _london.tracksViewChanges = YES;
  _london.map = self.mapView;
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
  [UIView animateWithDuration:5.0
                   animations:^{
    self->_londonView.tintColor = [UIColor blueColor];
  }
                   completion:^(BOOL finished) {
    // Stop tracking view changes to allow CPU to idle.
    self->_london.tracksViewChanges = NO;
  }];
}

@end
      

iconView bir UIView kabul ettiğinden, işaretçilerinizi tanımlayan standart kullanıcı arayüzü kontrolleri hiyerarşisine sahip olabilirsiniz. Her görünümde standart animasyon özellikleri bulunur. İşaretçi boyutu, rengi ve alfa seviyelerinde değişiklikler yapabilir ve dilediğiniz dönüşümleri uygulayabilirsiniz. iconView özelliği, frame ve center hariç olmak üzere UIView öğesinin tüm animasyonlu özelliklerinin animasyonunu destekler.

iconView özelliğini kullanırken aşağıdaki hususları göz önünde bulundurun:

  • UIView, tracksViewChanges YES olarak ayarlandığında kaynakları yoğun şekilde kullanabilir. Bu da pil kullanımının artmasına neden olabilir. Buna karşılık, tek bir kare UIImage statiktir ve yeniden oluşturulması gerekmez.
  • Ekranda çok sayıda işaretçi varsa, her işaretçinin kendi UIView öğesi varsa ve tüm işaretçiler değişiklikleri aynı anda izliyorsa bazı cihazlar haritayı oluşturmakta zorlanabilir.
  • iconView, görünümün anlık görüntüsü olduğundan kullanıcı etkileşimine yanıt vermez.
  • Görünüm, gerçek değerinden bağımsız olarak clipsToBounds, YES olarak ayarlanmış gibi davranır. Sınırların dışında çalışan dönüşümler uygulayabilirsiniz ancak çizdiğiniz nesne, nesnenin sınırları içinde olmalıdır. Tüm dönüşümler/vardiyalar izlenir ve uygulanır. Kısacası alt görünümler, görünümün içinde yer almalıdır.
  • GMSMarker üzerinde -copyWithZone: kullanmak için önce GMSMarker kopyalamanız ve ardından kopyada yeni bir iconView örneği ayarlamanız gerekir. UIView, NSCopying özelliğini desteklemediği için iconView kopyalanamıyor.

tracksViewChanges özelliğini ne zaman ayarlayacağınıza karar vermek için performansla ilgili hususları, işaretçinin otomatik olarak yeniden çizilmesinin avantajlarıyla karşılaştırmanız gerekir. Örneğin:

  • Yapmanız gereken bir dizi değişiklik varsa özelliği YES olarak değiştirip ardından tekrar NO olarak değiştirebilirsiniz.
  • Bir animasyon çalışırken veya içerikler eşzamansız olarak yüklenirken işlemler tamamlanana kadar özelliği YES olarak ayarlamanız gerekir.

İşaretçi opaklığını değiştirme

İşaretçinin opaklığını opacity özelliğiyle kontrol edebilirsiniz. Opaklığı 0,0 ile 1,0 arasında bir kayan değer olarak belirtmeniz gerekir. Burada 0 tamamen şeffaf, 1 ise tamamen opaktır.

Swift

marker.opacity = 0.6
      

Objective-C

marker.opacity = 0.6;
      

GMSMarkerLayer kullanarak Core Animation ile işaretçi opaklığını canlandırabilirsiniz.

İşaretçiyi düzleştirme

İşaretçi simgeleri normalde haritanın yüzeyine göre değil, cihazın ekranına göre çizilir. Bu nedenle, haritayı döndürmek, eğmek veya yakınlaştırmak işaretçinin yönünü değiştirmez.

Bir işaretçinin yönünü, Dünya'ya göre düz olacak şekilde ayarlayabilirsiniz. Düz işaretçiler, harita döndürüldüğünde döner ve harita eğildiğinde perspektif değiştirir. Normal işaretçilerde olduğu gibi, düz işaretçiler de harita yakınlaştırıldığında veya uzaklaştırıldığında boyutlarını korur.

İşaretçinin yönünü değiştirmek için işaretçinin flat özelliğini YES veya true olarak ayarlayın.

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let londonMarker = GMSMarker(position: positionLondon)
londonMarker.isFlat = true
londonMarker.map = mapView
      

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon];
londonMarker.flat = YES;
londonMarker.map = mapView;
      

İşaretçiyi döndürme

rotation özelliğini ayarlayarak bir işaretçiyi sabitleme noktası etrafında döndürebilirsiniz. Döndürmeyi, varsayılan konumdan saat yönünde derece cinsinden ölçülen bir CLLocationDegrees türü olarak belirtin. İşaretçi harita üzerinde düz olduğunda varsayılan konum kuzeydir.

Aşağıdaki örnekte işaretçi 90° döndürülmektedir. groundAnchor mülkünün 0.5,0.5 olarak ayarlanması, işaretçinin tabanı yerine merkezi etrafında döndürülmesine neden olur.

Swift

let degrees = 90.0
londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
londonMarker.rotation = degrees
londonMarker.map = mapView
      

Objective-C

CLLocationDegrees degrees = 90;
londonMarker.groundAnchor = CGPointMake(0.5, 0.5);
londonMarker.rotation = degrees;
londonMarker.map = mapView;
      

İşaretçilerdeki etkinlikleri işleme

Kullanıcının bir işaretçiye dokunması gibi haritada gerçekleşen etkinlikleri dinleyebilirsiniz. Etkinlikleri dinlemek için GMSMapViewDelegate protokolünü uygulamanız gerekir. Belirli işaretçi etkinliklerinin nasıl işleneceğini öğrenmek için işaretçi etkinlikleri ve hareketleri bölümüne bakın. Etkinlikler kılavuzunda, GMSMapViewDelegate'teki yöntemlerin listesi de yer alır. Street View etkinlikleri için GMSPanoramaViewDelegate sayfasını inceleyin.