1. Başlamadan Önce
Soyut
Bu codelab'de, Objective-C ile iOS uygulamaları oluşturmak için Google Haritalar Platformu'nu kullanmaya başlamak üzere bilmeniz gereken her şeyi öğreneceksiniz. Kurulumdan iOS için Haritalar SDK'sını yüklemeye, ilk haritanızı görüntülemeye, işaretçiler ve işaretçi kümeleme ile çalışmaya, harita üzerinde çizim yapmaya ve kullanıcı etkileşimini işlemeye kadar tüm temel bilgileri öğreneceksiniz.
Ne oluşturacaksınız?
Bu codelab'de, aşağıdakileri yapan bir iOS uygulaması oluşturacaksınız:
- iOS için Haritalar SDK'sını ve iOS için Haritalar SDK'sı Yardımcı Kitaplığı'nı yükler.
- Avustralya'nın Sidney şehrini merkezine alan bir harita gösterir.
- Sidney çevresindeki 100 nokta için özel işaretçiler gösterir.
- İşaretçi gruplamayı uygular.
- Bir işaretçi tıklandığında haritayı yeniden ortalayan ve haritada bir daire çizen kullanıcı etkileşimini etkinleştirir.
Neler öğreneceksiniz?
- Google Haritalar Platformu'nu kullanmaya başlama
- iOS için Haritalar SDK'sını ve iOS için Google Haritalar SDK'sı Yardımcı Kitaplığı'nı yükleme
- Harita yükleme
- İşaretçileri, özel işaretçileri ve işaretçi kümelemeyi kullanma
- Kullanıcı etkileşimi sağlamak için iOS için Haritalar SDK'sının etkinlik sistemiyle çalışma
- Haritayı programatik olarak kontrol etme
- Harita üzerinde çizim yapma
Ön koşullar
Bu codelab'i tamamlamak için aşağıdaki öğeler hakkında bilgi edinmeniz gerekir. Google Haritalar Platformu ile çalışmaya aşinaysanız doğrudan codelab'e geçebilirsiniz.
Gerekli Google Haritalar Platformu ürünleri
Bu codelab'de aşağıdaki Google Haritalar Platformu ürünlerini kullanacaksınız:
- iOS için Haritalar SDK'sı
- iOS için Google Haritalar SDK'sı Yardımcı Kitaplığı
Google Haritalar Platformu'nu kullanmaya başlayın
Google Haritalar Platformu'nu daha önce kullanmadıysanız aşağıdaki adımları tamamlamak için Google Haritalar Platformu'nu Kullanmaya Başlama Kılavuzu'nu inceleyin veya Google Haritalar Platformu'nu Kullanmaya Başlama oynatma listesini izleyin:
- Faturalandırma hesabı oluşturun.
- Proje oluşturun.
- Google Haritalar Platformu API'lerini ve SDK'larını (önceki bölümde listelenmiştir) etkinleştirin.
- API anahtarı oluşturun.
Bu codelab için diğer şartlar
Bu codelab'i tamamlamak için aşağıdaki hesaplara, hizmetlere ve araçlara ihtiyacınız vardır:
- Faturalandırmanın etkinleştirildiği bir Google Cloud Platform hesabı
- iOS için Haritalar SDK'sının etkinleştirildiği bir Google Haritalar Platformu API anahtarı
- Objective-C hakkında temel bilgi
- Hedef SDK'sı 12.0 veya sonraki sürümler olan Xcode 12.0
2. Hazırlanın
Aşağıdaki etkinleştirme adımı için iOS için Haritalar SDK'sı'nı etkinleştirmeniz gerekir.
Google Haritalar Platformu'nu ayarlama
Henüz bir Google Cloud Platform hesabınız ve faturalandırmanın etkinleştirildiği bir projeniz yoksa lütfen faturalandırma hesabı ve proje oluşturmak için Google Haritalar Platformu'nu Kullanmaya Başlama kılavuzuna bakın.
- Cloud Console'da proje açılır menüsünü tıklayın ve bu codelab için kullanmak istediğiniz projeyi seçin.
- Bu codelab için gereken Google Haritalar Platformu API'lerini ve SDK'larını Google Cloud Marketplace'te etkinleştirin. Bunun için bu videodaki veya bu dokümandaki adımları uygulayın.
- Cloud Console'un Kimlik Bilgileri sayfasında bir API anahtarı oluşturun. Bu videodaki veya bu dokümandaki adımları uygulayabilirsiniz. Google Haritalar Platformu'na yapılan tüm istekler için API anahtarı gerekir.
Proje Başlangıç Şablonu Kurulumu
Bu codelab'e başlamadan önce, başlangıç projesi şablonunu ve tam çözüm kodunu indirmek için aşağıdakileri yapın:
- Bu codelab'in GitHub deposunu https://github.com/googlecodelabs/maps-platform-101-objc adresinden indirin veya çatallayın.
StarterApp projesi /starter
dizininde bulunur ve codelab'i tamamlamak için ihtiyacınız olan temel dosya yapısını içerir. Çalışmak için ihtiyaç duyduğunuz her şey /starter/StarterApp
dizininde bulunur.
Çalışan tam çözüm kodunu görmek istiyorsanız yukarıdaki kurulum adımlarını tamamlayabilir ve çözümü /solution/SolutionApp
dizininde görüntüleyebilirsiniz.
3. iOS için Haritalar SDK'sını yükleme
iOS için Haritalar SDK'sını kullanmanın ilk adımı, gerekli bağımlılıkları yüklemektir. Bu işlem iki adımdan oluşur: iOS için Haritalar SDK'sını ve iOS için Haritalar SDK'sı Yardımcı Kitaplığı'nı Cocoapods bağımlılık yöneticisinden yükleme ve API anahtarınızı SDK'ya sağlama.
- iOS için Haritalar SDK'sını ve iOS için Haritalar SDK'sı Yardımcı Kitaplığı'nı
Podfile
'ya ekleyin.
Bu codelab'de hem Google Haritalar'ın tüm temel işlevlerini sağlayan iOS için Haritalar SDK'sını hem de işaretçi kümeleme dahil olmak üzere haritanızı zenginleştirmek için çeşitli yardımcı programlar sağlayan iOS için Haritalar Yardımcı Program Kitaplığı'nı kullanacaksınız.
Başlamak için Xcode'da (veya tercih ettiğiniz metin düzenleyicide) Pods > Podfile
dosyasını açın ve dosyayı, use_frameworks!
altında iOS için Haritalar SDK'sı ve Utility Library bağımlılıklarını içerecek şekilde güncelleyin:
pod 'GoogleMaps'
pod 'Google-Maps-iOS-Utils'
- iOS için Haritalar SDK'sını ve iOS için Haritalar SDK'sı Yardımcı Kitaplığı pod'larını yükleyin.
Bağımlılıkları yüklemek için komut satırından /starter
dizininde pod install
komutunu çalıştırın. Cocoapods, bağımlılıkları otomatik olarak indirir ve StarterApp.xcworkspace
oluşturur. 3. Bağımlılıklarınız yüklendikten sonra Xcode'da StarterApp.xcworkspace
dosyasını açın ve Command+R
tuşuna basarak uygulamayı iPhone simülatöründe çalıştırın. Her şey doğru şekilde ayarlanmışsa simülatör başlatılır ve siyah bir ekran gösterilir. Endişelenmeyin. Henüz bir şey oluşturmadığınız için bu durum normaldir. 4. SDK'yı AppDelegate.h
içine aktarın.
Bağımlılıklarınız yüklendiğine göre artık API anahtarınızı SDK'ya sağlama zamanı. İlk adım, iOS için Haritalar SDK'sını bağımlılık olarak içe aktarmaktır. Bunun için #import "AppDelegate.h"
import ifadesinin altına aşağıdakileri ekleyin:
@import GoogleMaps;
- iOS SDK içe aktarma ifadesinin altına, değeri API anahtarınız olarak ayarlanmış bir
NSString
sabiti bildirin:
static NSString *const kMapsAPIKey = @"YOUR API KEY";
provideAPIKey
işleviniapplication: didFinishLaunchingWithOptions:
içindeGMSServices
üzerinde çağırarak API anahtarını iOS SDK'sına iletin.
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:kMapsAPIKey];
return YES;
}
Güncellenen AppDelegate.m
dosyanız artık şu şekilde görünmelidir:
#import "AppDelegate.h"
@import GoogleMaps;
static NSString *const kMapsAPIKey = @"YOUR API KEY";
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GMSServices provideAPIKey:kMapsAPIKey];
return YES;
}
@end
Podfile
öğeniz aşağıdaki gibi görünmelidir:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'
target 'StarterApp' do
use_frameworks!
pod 'GoogleMaps', '5.1.0.0'
pod 'Google-Maps-iOS-Utils', '3.4.0'
end
Bağımlılıklarınız yüklendiğine ve API anahtarınız sağlandığına göre artık iOS için Haritalar SDK'sına çağrı yapmaya başlayabilirsiniz.
4. Harita görüntüleme
İlk haritanızı gösterme zamanı!
iOS için Haritalar SDK'sının en yaygın kullanılan kısmı, harita örnekleri oluşturmanıza ve bunları değiştirmenize olanak tanıyan birçok yöntemi sağlayan GMSMapView
sınıfıdır. Bu işlemi nasıl yapacağınız aşağıda açıklanmıştır.
ViewController.m
adlı kişiyi aç.
Bu codelab'in geri kalan tüm çalışmalarını burada yapacaksınız. Görünüm denetleyicisi için loadView
ve viewDidLoad
yaşam döngüsü etkinliklerinin sizin için zaten oluşturulduğunu fark edeceksiniz. 2. Dosyanın en üstüne aşağıdakileri ekleyerek iOS için Haritalar SDK'sını içe aktarın:
@import GoogleMaps;
ViewController
değerini depolamak içinGMSMapView
bir örnek değişkeni bildirin.
GMSMapView
örneği, bu codelab boyunca çalışacağınız ana nesnedir. Çeşitli görünüm denetleyicisi yaşam döngüsü yöntemlerinden buna referans verecek ve üzerinde işlem yapacaksınız. Kullanıma sunmak için ViewController
uygulamasını, bunu depolayacak bir örnek değişkeni bildirecek şekilde güncelleyin:
@implementation ViewController {
GMSMapView *_mapView;
}
loadView
içindeGMSCameraPosition
örneği oluşturun.
GMSCameraPosition
, haritanın nerede ortalanacağını ve hangi yakınlaştırma düzeyinin görüntüleneceğini tanımlar. Bu kod, haritayı Avustralya'nın Sidney şehrinde, enlemi -33.86 ve boylamı 151.20 olacak şekilde ve 12 yakınlaştırma düzeyiyle ortalamak için cameraWithLatitude:longitude:zoom:
yöntemini çağırır:
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 longitude:151.20 zoom:12];
- Haritayı oluşturmak için
loadView
içindeGMSMapView
örneği oluşturun.
Yeni bir harita örneği oluşturmak için mapWithFrame:camera:
işlevini çağırın. Çerçevenin, görünüm denetleyicisinin içinde (0,0) konumunda bulunan, 0 genişlik ve 0 yüksekliğe sahip bir çerçeveyi belirten iOS CGGeometry
kitaplığındaki genel bir değişken olan CGRectZero
olarak ayarlandığına dikkat edin. Kamera, yeni oluşturduğunuz kamera konumuna ayarlanır.
Haritayı gerçekten görüntülemek için bir sonraki adımda görünüm denetleyicisinin kök görünümünü _mapview
olarak ayarlarsınız. Bu işlem, haritanın tam ekran olarak gösterilmesini sağlar.
_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
self.view = _mapView;
GMSMapViewDelegate
öğesini görünüm denetleyicisine ayarlayın.
Uygulandığında, harita görünümü temsilcisi, sonraki adımlarda ihtiyacınız olacak GMSMapView
örneğindeki kullanıcı etkileşimlerinden gelen etkinlikleri işlemenize olanak tanır.
Öncelikle ViewController
arayüzünü GMSMapViewDelegate:
protokolüne uygun şekilde güncelleyin.
@interface ViewController ()<GMSMapViewDelegate>
Ardından, GMSMapViewDelegate
değerini ViewController
olarak ayarlamak için aşağıdakileri ekleyin.
_mapView.delegate = self;
Şimdi uygulamayı iOS simülasyon aracında yeniden yükleyin (Command+R
). Harita görünmelidir.
Özetlemek gerekirse bu adımda, Avustralya'nın Sidney şehrine odaklanmış bir harita göstermek için GMSMapView
örneği oluşturdunuz.
ViewController.m
dosyanız artık şu şekilde görünmelidir:
#import "ViewController.h"
#import "LocationGenerator.h"
@import GoogleMaps;
@interface ViewController ()<GMSMapViewDelegate>
@end
@implementation ViewController {
GMSMapView *_mapView;
}
- (void)loadView {
[super loadView];
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 longitude:151.20 zoom:12];
_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
self.view = _mapView;
_mapView.delegate = self;
}
5. Bulut tabanlı harita stili (isteğe bağlı)
Bulut tabanlı harita stilleri'ni kullanarak haritanızın stilini özelleştirebilirsiniz.
Harita kimliği oluşturma
Henüz ilişkili bir harita stiline sahip bir harita kimliği oluşturmadıysanız aşağıdaki adımları tamamlamak için Harita Kimlikleri kılavuzuna bakın:
- Harita kimliği oluşturun.
- Harita kimliğini harita stiliyle ilişkilendirin.
Uygulamanıza harita kimliği ekleme
Önceki adımda oluşturduğunuz harita kimliğini kullanmak için ViewController.m
dosyasını açın ve loadView
yöntemi içinde bir GMSMapID
nesnesi oluşturup harita kimliğini sağlayın. Ardından, GMSMapView
oluşturma işlemini GMSMapID
nesnesini parametre olarak sağlayarak değiştirin.
ViewController.m
- (void)loadView {
GMSMapID *mapID = [[GMSMapID alloc] initWithIdentifier:@"YOUR_MAP_ID"];
_mapView = [GMSMapView mapWithFrame:CGRectZero mapID:mapID camera:camera];
// ...
}
Bu işlemi tamamladıktan sonra, seçtiğiniz stildeki haritanızı görmek için uygulamayı çalıştırın.
6. Haritaya İşaretçi Ekleme
Geliştiriciler, iOS için Haritalar SDK'sı ile birçok şey yapabilir ancak haritaya işaretçi yerleştirmek kesinlikle en popüler olanıdır. İşaretçiler, haritada belirli noktaları göstermenizi sağlar ve kullanıcı etkileşimini yönetmek için kullanılan yaygın bir kullanıcı arayüzü öğesidir. Daha önce Google Haritalar'ı kullandıysanız muhtemelen şu şekilde görünen varsayılan işaretçiyi biliyorsunuzdur:
Bu adımda, haritaya işaretçi yerleştirmek için GMSMarker
sınıfını nasıl kullanacağınızı öğreneceksiniz.
Görünüm denetleyicisinin loadView
yaşam döngüsü etkinliğinde harita yüklenene kadar haritaya işaretçi yerleştirilemeyeceğini unutmayın. Bu nedenle, bu adımları görünüm (ve harita) yüklendikten sonra çağrılan viewDidLoad
yaşam döngüsü etkinliğinde tamamlayacaksınız.
- Bir
CLLocationCoordinate2D
nesnesi tanımlayın.
CLLocationCoordinate2D
, iOS CoreLocation kitaplığı tarafından sunulan ve belirli bir enlem ve boylamda coğrafi bir konumu tanımlayan bir yapıdır. İlk işaretçinizi oluşturmaya başlamak için bir CLLocationCoordinate2D
nesnesi tanımlayın ve enlem ile boylamı haritanın merkezine ayarlayın. Haritanın merkezinin koordinatlarına, camera.target.latitude
ve camera.target.longitude
özellikleri kullanılarak harita görünümünden erişilebilir.
CLLocationCoordinate2D mapCenter = CLLocationCoordinate2DMake(_mapView.camera.target.latitude, _mapView.camera.target.longitude);
GMSMarker
örneği oluşturun.
iOS için Haritalar SDK'sı, GMSMarker
sınıfını sağlar. GMSMarker
öğesinin her örneği, haritada ayrı bir işaretçiyi temsil eder ve markerWithPosition:
çağrılarak oluşturulur. İşaretçinin haritada nereye yerleştirileceğini SDK'ya bildirmek için CLLocationCoordinate2D
nesnesi iletilir.
.
GMSMarker *marker = [GMSMarker markerWithPosition:mapCenter];
- Özel işaretçi simgesi ayarlayın.
Google Haritalar'ın varsayılan kırmızı raptiye işaretleyicisi harika olsa da haritanızı özelleştirmek de harika bir seçenek. Neyse ki iOS için Haritalar SDK'sı ile özel işaretçi kullanmak çok kolaydır. StarterApp projesinde kullanabileceğiniz "custom_pin.png" adlı bir resim olduğunu fark edeceksiniz ancak istediğiniz resmi kullanabilirsiniz.
Özel işaretçiyi ayarlamak için işaretçinin icon
özelliğini UIImage
örneği olarak ayarlayın.
marker.icon = [UIImage imageNamed:@"custom_pin.png"];
- İşaretçiyi haritaya yerleştirin.
İşaretçiniz oluşturulur ancak haritada görünmez. Bunu yapmak için GMSMarker
örneğinin map
özelliğini GMSMapView
örneği olarak ayarlayın.
marker.map = _mapView;
Şimdi uygulamayı yeniden yükleyin ve işaretçi içeren ilk haritanızı görün.
Özetlemek gerekirse bu bölümde, GMSMarker sınıfının bir örneğini oluşturdunuz ve haritada işaretçi görüntülemek için bunu harita görünümüne uyguladınız. ViewController.m
içindeki güncellenmiş viewDidLoad yaşam döngüsü etkinliğiniz artık şöyle görünmelidir:
- (void)viewDidLoad {
[super viewDidLoad];
CLLocationCoordinate2D mapCenter = CLLocationCoordinate2DMake(_mapView.camera.target.latitude, _mapView.camera.target.longitude);
GMSMarker *marker = [GMSMarker markerWithPosition:mapCenter];
marker.icon = [UIImage imageNamed:@"custom_pin.png"];
marker.map = _mapView;
}
7. İşaretçi kümelemeyi etkinleştirme
Çok sayıda işaretçi veya birbirine yakın işaretçi kullanırken işaretçilerin çakıştığı ya da çok kalabalık göründüğü bir sorunla karşılaşabilirsiniz. Bu durum, kötü bir kullanıcı deneyimine neden olur. Örneğin, iki işaretçi birbirine çok yakınsa aşağıdaki gibi bir durumla karşılaşabilirsiniz:
İşaretçi kümeleme tam da bu noktada devreye girer. İşaretçi kümeleme, yaygın olarak uygulanan bir diğer özelliktir. Bu özellik, yakındaki işaretçileri yakınlaştırma düzeyine bağlı olarak değişen tek bir simge hâlinde gruplandırır. Örneğin:
İşaretçi kümeleme algoritması, haritanın görünür alanını bir tabloya böler ve ardından aynı hücredeki simgeleri kümelendirir. Neyse ki Google Haritalar Platformu ekibi, iOS için Google Haritalar SDK'sı Yardımcı Kitaplığı adlı faydalı bir açık kaynak yardımcı kitaplığı oluşturduğu için bu konuda endişelenmenize gerek yok. Bu kitaplık, diğer birçok şeyin yanı sıra işaretçi kümelemeyi sizin için otomatik olarak gerçekleştirir. İşaretçi kümeleme hakkında daha fazla bilgiyi Google Haritalar Platformu belgelerinde bulabilir veya iOS Utility Library'nin kaynağını GitHub'da inceleyebilirsiniz.
- Haritaya çok daha fazla işaretçi ekleyin.
İşaretçi kümelemeyi uygulamada görmek için haritada çok sayıda işaretçi olması gerekir. Bu işlemi kolaylaştırmak için LocationGenerator.m
içindeki başlangıç projesinde kullanışlı bir işaretçi oluşturucu sağlanır.
Haritanıza istediğiniz kadar işaretçi eklemek için önceki adımdaki kodun altına, görünüm denetleyicisinin viewDidLoad
yaşam döngüsünde generateMarkersNear:count:
işlevini çağırmanız yeterlidir. Bu yöntem, count
içinde belirtilen işaretçi sayısını, CLLocationCoordinate2D
nesnesinde belirtilen koordinatların etrafındaki rastgele konumlarda oluşturur. Bu durumda, daha önce oluşturduğunuz mapCenter
değişkenini iletmeniz yeterlidir. İşaretçiler NSArray
içinde döndürülür.
NSArray<GMSMarker *> *markerArray = [LocationGenerator generateMarkersNear:mapCenter count:100];
- iOS için Google Haritalar SDK'sı Yardımcı Program Kitaplığı'nı içe aktarın.
Maps iOS yardımcı kitaplığını projenize bağımlılık olarak eklemek için ViewController.m
dosyasının en üstündeki bağımlılıklar listesine aşağıdakileri ekleyin:
@import GoogleMapsUtils;
- İşaretçi kümeleyicinin yapılandırılması.
İşaretçi kümeleyiciyi kullanmak için nasıl çalışacağını yapılandırmak üzere üç şey sağlamanız gerekir: bir kümeleme algoritması, bir simge oluşturucu ve bir oluşturucu. Algoritma, işaretçilerin nasıl kümeleneceğini (ör. aynı kümeye dahil edilecek işaretçiler arasındaki mesafe) belirler. Simge oluşturucu, farklı yakınlaştırma düzeylerinde kullanılacak küme simgelerini sağlar. Oluşturucu, küme simgelerinin haritada oluşturulmasını sağlar.
İsterseniz bunların hepsini sıfırdan yazabilirsiniz ancak Haritalar iOS yardımcı kitaplığı, süreci kolaylaştırmak için varsayılan uygulamalar sunar. Şunları eklemeniz yeterlidir:
id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init];
id<GMUClusterIconGenerator> clusterIconGenerator = [[GMUDefaultClusterIconGenerator alloc] init];
id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView clusterIconGenerator:clusterIconGenerator];
GMUClusterManager
örneği oluşturun.
GMUClusterManager
, sizin tarafınızdan belirtilen algoritmayı, simge oluşturucuyu ve oluşturucuyu kullanarak işaretçi kümelemeyi uygulayan sınıftır. Oluşturucuyu oluşturmak ve harita görünümünde kullanılabilir hale getirmek için öncelikle ViewController
uygulamasına bir örnek değişkeni ekleyerek küme yöneticisi örneğini saklayın:
@implementation ViewController {
GMSMapView *_mapView;
GMUClusterManager *_clusterManager;
}
Ardından, GMUClusterManager
örneğini viewDidLoad
yaşam döngüsü etkinliğinde oluşturun:
_clusterManager = [[GMUClusterManager alloc] initWithMap:_mapView algorithm:algorithm renderer:renderer];
- İşaretçileri ekleyin ve işaretçi kümeleyicinin çalıştırın.
İşaretçi kümeleyici örneğiniz yapılandırıldığına göre, yapmanız gereken tek şey addItems:
işlevini çağırarak kümelenecek işaretçi dizisini küme yöneticisine iletmek ve ardından cluster
işlevini çağırarak kümeleyiciyi çalıştırmaktır.
[_clusterManager addItems:markerArray];
[_clusterManager cluster];
Uygulamanızı yeniden yüklediğinizde, tüm işaretçilerin güzelce gruplandırıldığını görürsünüz. İşaretçi kümelerinin yakınlaştırıp uzaklaştırdıkça nasıl değiştiğini görmek için haritayı parmaklarınızla yakınlaştırıp uzaklaştırarak farklı yakınlaştırma seviyelerini deneyin.
Özetlemek gerekirse bu adımda, Google Haritalar iOS SDK Yardımcı Kitaplığı'ndan bir işaretçi kümeleyici örneği yapılandırdınız ve ardından haritadaki 100 işaretçiyi kümelemek için bu örneği kullandınız. ViewController.m
içindeki viewDidLoad
yaşam döngüsü etkinliğiniz artık şu şekilde görünecek:
- (void)viewDidLoad {
[super viewDidLoad];
CLLocationCoordinate2D mapCenter = CLLocationCoordinate2DMake(_mapView.camera.target.latitude,
_mapView.camera.target.longitude);
GMSMarker *marker = [GMSMarker markerWithPosition:mapCenter];
marker.icon = [UIImage imageNamed:@"custom_pin.png"];
marker.map = _mapView;
NSArray<GMSMarker *> *markerArray = [LocationGenerator generateMarkersNear:mapCenter count:100];
id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init];
id<GMUClusterIconGenerator> clusterIconGenerator = [[GMUDefaultClusterIconGenerator alloc] init];
id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:_mapView clusterIconGenerator:clusterIconGenerator];
_clusterManager = [[GMUClusterManager alloc] initWithMap:_mapView algorithm:algorithm renderer:renderer];
[_clusterManager addItems:markerArray];
[_clusterManager cluster];
}
8. Kullanıcı Etkileşimi Ekleme
Artık işaretçileri görüntüleyen ve işaretçi kümelemeyi kullanan harika görünümlü bir haritanız var. Bu adımda, haritanızın kullanıcı deneyimini iyileştirmek için daha önce görünüm denetleyicisine ayarladığınız GMSMapViewDelegate
kullanarak kullanıcı etkileşimleriyle ilgili bazı ek işlemler ekleyeceksiniz.
iOS için Haritalar SDK'sı, harita görünümü temsilcisi aracılığıyla uygulanan kapsamlı bir etkinlik sistemi sağlar. Bu sistem, çeşitli kullanıcı etkileşimleri gerçekleştiğinde kod yürütmenize olanak tanıyan etkinlik işleyicileri içerir. Örneğin, mapview temsilcisi, kullanıcının haritayı ve işaretçileri tıklaması, haritanın görünümünü kaydırması, yakınlaştırma ve uzaklaştırma gibi etkileşimler için kod yürütmeyi tetiklemenize olanak tanıyan yöntemler içerir.
Bu adımda, kullanıcının dokunduğu herhangi bir işaretçiyi ortalayacak şekilde haritayı programatik olarak kaydıracaksınız.
- İşaretçi dokunma işleyicisini uygulayın.
mapView:didTapMarker
, kullanıcının daha önce oluşturduğunuz işaretçilerden birine dokunduğu her seferde ve bir işaretçi kümesine dokunduğu her seferde çağrılır (işaretçi kümeleri dahili olarak GMSMarker
örneği olarak uygulanır).
Etkinlik işleyiciyi uygulamak için ViewController.m
dosyasının en altında, end
ifadesinden önce bir taslak oluşturarak başlayın.
Yöntemin NO
döndürdüğünü görürsünüz. Bu işlem, iOS SDK'ya etkinlik işleyici kodunuzu yürüttükten sonra varsayılan GMSMarker
işlevini (ör. yapılandırılmışsa bilgi penceresi gösterme) yürütmeye devam etmesini söyler.
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
return NO;
}
- Dokunma etkinliğini işleyin ve bir işaretçiye veya işaretçi kümesine dokunulduğunda kamerayı animasyonla hareket ettirerek haritayı yeniden ortalayın.
Çağrıldığında, mapView:didTapMarker
dokunulan GMSMarker
örneğini ileterek kodunuzda bu örneği işlemenize olanak tanır. Bu örneği, etkinlik işleyicinin içinden harita görünümünde animateToLocation:
işlevini çağırarak ve position
özelliğinde bulunan işaretçi örneğinin konumunu ileterek haritayı yeniden ortalamak için kullanabilirsiniz.
[_mapView animateToLocation:marker.position];
- Bir işaretçi kümesine dokunulduğunda yakınlaştırın.
Yaygın bir kullanıcı deneyimi kalıbı, işaretçi kümelerine dokunulduğunda yakınlaştırmaktır. Bu sayede kullanıcılar, daha düşük yakınlaştırma düzeylerinde küme genişleyeceği için kümelenmiş işaretçileri görüntüleyebilir.
Daha önce belirtildiği gibi, işaretçi kümesi simgesi aslında özel bir simgeyle GMSMarker
öğesinin uygulanmış halidir. Peki, bir işaretçiye mi yoksa işaretçi kümesine mi dokunulduğunu nasıl anlayabilirsiniz? İşaretçi kümeleyici yöneticisi yeni bir küme simgesi oluşturduğunda, GMSMarker
protokolüne uymak için GMUCluster.
örneğini uygular. İşaretçinin etkinlik işleyiciye iletilirken bu protokole uyup uymadığını kontrol etmek için koşullu bir ifade kullanabilirsiniz.
Bir kümenin programatik olarak dokunulduğunu öğrendikten sonra harita görünümü örneğinde animateToZoom:
işlevini çağırabilir ve yakınlaştırmayı mevcut yakınlaştırma düzeyine artı bir olarak ayarlayabilirsiniz. Mevcut yakınlaştırma düzeyi, camera.zoom
özelliğindeki harita görünümü örneğinde kullanılabilir.
Ayrıca, aşağıdaki kodun nasıl YES
döndürdüğüne dikkat edin. Bu, etkinlik işleyiciye etkinliği işlemeyi tamamladığınızı ve işleyicide başka kod yürütmemesini bildirir. Bunu yapmanın nedenlerinden biri, temel alınan GMSMarker
nesnesinin varsayılan davranışının geri kalanını (ör. bir küme simgesine dokunulduğunda pek anlamlı olmayacak bir bilgi penceresi gösterme) yürütmesini engellemektir.
if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) {
[_mapView animateToZoom:_mapView.camera.zoom +1];
return YES;
}
Şimdi uygulamayı yeniden yükleyin ve bazı işaretçilere ve işaretçi kümelerine dokunun. Bunlardan birine dokunulduğunda haritanın merkezi, dokunulan öğe olacak şekilde değişir. Bir işaretçi kümesine dokunulduğunda harita da bir düzey yakınlaşır ve işaretçi kümesi, altında kümelenmiş işaretçileri gösterecek şekilde genişler.
Özetlemek gerekirse bu adımda işaretçi dokunma işleyicisini uyguladınız ve dokunulan öğeyi ortalamak için etkinliği işlediniz. Ayrıca, bu öğe bir işaretçi kümesi simgesi ise yakınlaştırma yaptınız.
mapView:didTapMarker
yönteminiz aşağıdaki gibi görünmelidir:
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
[_mapView animateToLocation:marker.position];
if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) {
[_mapView animateToZoom:_mapView.camera.zoom +1];
return YES;
}
return NO;
}
9. Harita üzerinde çizme
Şimdiye kadar 100 rastgele noktada işaretçiler gösteren ve kullanıcı etkileşimini işleyen bir Sidney haritası oluşturdunuz. Bu codelab'in son adımında, harita deneyiminize ek bir yararlı özellik eklemek için iOS için Haritalar SDK'sının çizim özelliklerini kullanacaksınız.
Bu haritanın, Sidney şehrini keşfetmek isteyen kullanıcılar tarafından kullanılacağını düşünün. Faydalı bir özellik, bir işaretçi tıklandığında etrafındaki yarıçapı görselleştirmektir. Bu sayede kullanıcı, tıklanan işaretçiye yürüme mesafesinde olan diğer yerleri kolayca anlayabilir.
iOS SDK'sında, haritada kare, poligon, çizgi ve daire gibi şekiller çizmek için bir dizi işlev bulunur. Ardından, bir işaretçi tıklandığında etrafında 800 metrelik (yaklaşık yarım mil) bir yarıçapı göstermek için bir daire oluşturacaksınız.
- ViewController'ın uygulamasına bir
_circ
örnek değişkeni ekleyin.
Bu örnek değişken, en son çizilen daireyi kaydetmek için kullanılır. Böylece, başka bir daire çizilmeden önce bu daire yok edilebilir. Sonuçta, her dokunulan işaretçinin etrafına bir daire çizilmesi kullanıcı için pek faydalı olmaz ve oldukça kötü görünür.
Bunu yapmak için ViewController
uygulamasını aşağıdaki gibi güncelleyin:
@implementation ViewController {
GMSMapView *_mapView;
GMUClusterManager *_clusterManager;
GMSCircle *_circ;
}
- Bir işaretçiye dokunulduğunda daireyi çizin.
mapView:didTapMarker
yönteminin en altına, circleWithPosition:radius:
yöntemini çağırıp dokunulan işaretçinin konumunu ileterek 800 metre yarıçaplı yeni bir daire çizmek için iOS SDK'sının GMSCircle
sınıfının bir örneğini oluşturacak aşağıdaki kodu ekleyin. Bu işlemi, yukarıda haritayı yeniden ortaladığınızda yaptığınız gibi yapın.
_circ = [GMSCircle circleWithPosition:marker.position radius:800];
- Dairenin stilini belirleyin.
Varsayılan olarak GMSCircle
, siyah fırçalı ve şeffaf dolgulu bir daire çizer. Bu yöntem yarıçapı göstermek için kullanılabilir ancak çok iyi görünmez ve biraz zor fark edilir. Ardından, dairenin UIColor
özelliğine UIColor
atayarak stili iyileştirmek için daireye bir dolgu rengi verin.fillColor
Aşağıdaki kod, %50 şeffaflıkla gri dolgu ekler:
_circ.fillColor = [UIColor colorWithRed: 0.67 green: 0.67 blue: 0.67 alpha: 0.5];
- Daireyi haritada oluşturun.
Daha önce işaretçi oluştururken olduğu gibi, yalnızca GMSCircle
örneği oluşturmanın haritada görünmesini sağlamadığını fark edeceksiniz. Bunu yapmak için harita görünümü örneğini dairenin map
özelliğine atamanız yeterlidir.
_circ.map = _mapView;
- Daha önce oluşturulmuş tüm çevreleri kaldırın.
Daha önce de belirtildiği gibi, haritaya sürekli olarak daire eklemek iyi bir kullanıcı deneyimi sunmaz. Önceki dokunma etkinliğiyle oluşturulan daireyi kaldırmak için map
özelliğini _circ
üst kısmında nil
olarak ayarlayın.mapView:didTapMarker
_circ.map = nil;
Uygulamayı yeniden yükleyin ve bir işaretçiye dokunun. Bir işaretçiye dokunulduğunda yeni bir daire çizildiğini ve daha önce oluşturulan dairelerin kaldırıldığını görürsünüz.
Özetlemek gerekirse bu adımda, bir işaretçiye dokunulduğunda daire oluşturmak için GMSCircle
sınıfını kullandınız.
mapView:didTapMarker
yönteminiz aşağıdaki gibi görünmelidir:
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker {
_circ.map = nil;
[_mapView animateToLocation:marker.position];
if ([marker.userData conformsToProtocol:@protocol(GMUCluster)]) {
[_mapView animateToZoom:_mapView.camera.zoom +1];
return YES;
}
_circ = [GMSCircle circleWithPosition:marker.position radius:800];
_circ.fillColor = [UIColor colorWithRed: 0.67 green: 0.67 blue: 0.67 alpha: 0.5];
_circ.map = _mapView;
return NO;
}
10. Tebrikler
Google Haritalar Platformu'nu kullanarak ilk iOS uygulamanızı başarıyla oluşturdunuz. Bu süreçte iOS için Haritalar SDK'sını yükleme, harita yükleme, işaretçilerle çalışma, haritayı kontrol etme ve harita üzerinde çizim yapma, kullanıcı etkileşimi ekleme gibi işlemleri gerçekleştirdiniz.
Tamamlanmış kodu görmek için /solution
dizinindeki bitmiş projeye göz atın.
Sırada ne var?
Bu codelab'de, iOS için Haritalar SDK'sı ile yapabileceklerinizin yalnızca temel bilgilerini ele aldık. Ardından, aşağıdaki özelliklerden bazılarını haritaya eklemeyi deneyin:
- Uydu, karma ve arazi haritalarını görüntülemek için harita türünü değiştirin.
- Yakınlaştırma ve harita kontrolleri gibi diğer kullanıcı etkileşimlerini özelleştirin.
- İşaretçiler tıklandığında bilgileri göstermek için bilgi pencereleri ekleyin.
- Uygulamanıza zengin Google Haritalar Platformu yer özellikleri ve verileri eklemek için iOS için Places SDK'yı inceleyin.
Web'de Google Haritalar Platformu ile çalışmanın diğer yolları hakkında daha fazla bilgi edinmek için aşağıdaki bağlantılara göz atın: