Bằng cách sử dụng SDK bản đồ dành cho iOS, bạn có thể nghe các sự kiện xảy ra trên bản đồ, chẳng hạn như sự kiện thay đổi camera hoặc sự kiện nhấn vào điểm đánh dấu.
Giới thiệu
Để nghe sự kiện, bạn phải triển khai giao thức GMSMapViewDelegate
. Thông thường, bạn triển khai
giao thức này trên bộ điều khiển chế độ xem hiển thị bản đồ. Sau đây là một ví dụ:
Swift
import GoogleMaps class Events: UIViewController, GMSMapViewDelegate { // ... }
Objective-C
@import GoogleMaps; @interface Events : UIViewController <GMSMapViewDelegate> @end
Khi GMSMapView
được tạo, bạn có thể đặt uỷ quyền của nó cho chế độ xem của bạn
thiết bị điều khiển. GMSMapViewDelegate
chỉ cung cấp các phương thức không bắt buộc. Để nghe
với bất kỳ sự kiện cụ thể nào, bạn phải triển khai phương thức có liên quan.
Swift
override func loadView() { super.loadView() let camera = GMSCameraPosition.camera( withLatitude: 1.285, longitude: 103.848, zoom: 12 ) let mapView = GMSMapView.map(withFrame: .zero, camera: camera) mapView.delegate = self self.view = mapView } // MARK: GMSMapViewDelegate func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) { print("You tapped at \(coordinate.latitude), \(coordinate.longitude)") }
Objective-C
- (void)loadView { [super loadView]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285 longitude:103.848 zoom:12]; GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView.delegate = self; self.view = mapView; } #pragma mark - GMSMapViewDelegate - (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude); }
Vị trí camera
Khi sử dụng GMSMapViewDelegate
, bạn có thể nghe những thay đổi đối với vị trí camera
dùng để kết xuất bản đồ. Có 3 sự kiện riêng biệt.
mapView:willMove:
cho biết vị trí của máy ảnh sắp thay đổi. Nếu đối sốgesture
được đặt thànhYES
, thì điều này là do một người dùng thực hiện một cử chỉ tự nhiên trênGMSMapView
, chẳng hạn như xoay hoặc nghiêng. Nếu không,NO
cho biết rằng đây là một phần của một thay đổi có lập trình – Ví dụ: thông qua các phương thức nhưanimateToCameraPosition:
hoặc cập nhật trực tiếp trên bản đồ. Đây cũng có thể làNO
nếu người dùng đã nhấn vào Các nút vị trí hoặc la bàn, có chức năng tạo ảnh động thay đổi máy ảnh.Phương thức này có thể được gọi vài lần trước
mapView:idleAtCameraPosition:
sẽ được gọi, mặc dù lệnh này thường chỉ xảy ra nếu ảnh động và cử chỉ xảy ra cùng một lúc – một cử chỉ ví dụ: sẽ huỷ mọi hoạt ảnh hiện tại và sẽ gọimapView:willMove:
lần thứ hai.mapView:didChangeCameraPosition:
được gọi liên tục trong một cử chỉ hoặc ảnh động, luôn sau khi gọimapView:willMove:
. Thông qua vị trí máy ảnh trung gian.Cuối cùng,
mapView:idleAtCameraPosition:
được gọi sau khi vị trí máy ảnh trênGMSMapView
sẽ chuyển sang trạng thái rảnh và chỉ định vị trí liên quan của máy ảnh. Tại thời điểm này, tất cả ảnh động và cử chỉ đều đã dừng.Các ứng dụng có thể sử dụng sự kiện này để kích hoạt làm mới điểm đánh dấu hoặc nội dung được hiển thị trên
GMSMapView
, thay vì tải lại nội dung trên mỗi thay đổi của camera.
Ví dụ: một ứng dụng có thể xoá GMSMapView
khi di chuyển, sau đó
mã hoá địa lý đảo ngược vị trí mà camera dừng lại.
Swift
let geocoder = GMSGeocoder() func mapView(_ mapView: GMSMapView, willMove gesture: Bool) { mapView.clear() } func mapView(_ mapView: GMSMapView, idleAt cameraPosition: GMSCameraPosition) { geocoder.reverseGeocodeCoordinate(cameraPosition.target) { (response, error) in guard error == nil else { return } if let result = response?.firstResult() { let marker = GMSMarker() marker.position = cameraPosition.target marker.title = result.lines?[0] marker.snippet = result.lines?[1] marker.map = mapView } } }
Objective-C
GMSGeocoder *geocoder; - (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture { [mapView clear]; } - (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)cameraPosition { id handler = ^(GMSReverseGeocodeResponse *response, NSError *error) { if (error != nil) { return; } GMSReverseGeocodeResult *result = response.firstResult; GMSMarker *marker = [GMSMarker markerWithPosition:cameraPosition.target]; marker.title = result.lines[0]; marker.snippet = result.lines[1]; marker.map = mapView; }; [geocoder reverseGeocodeCoordinate:cameraPosition.target completionHandler:handler]; }
Sự kiện về doanh nghiệp và các địa điểm yêu thích khác
Theo mặc định, địa điểm ưa thích (POI) xuất hiện trên bản đồ cơ sở cùng với các biểu tượng tương ứng của chúng. Địa điểm yêu thích bao gồm công viên, trường học, toà nhà chính phủ và các địa điểm khác, cũng như địa điểm yêu thích là doanh nghiệp, chẳng hạn như cửa hàng, nhà hàng và khách sạn.
Bạn có thể phản hồi các sự kiện nhấp chuột trên một địa điểm yêu thích. Xem hướng dẫn về doanh nghiệp và các địa điểm yêu thích khác.
Các sự kiện khác
Để tìm hiểu danh sách đầy đủ các phương thức trên GMSMapViewDelegate
, hãy xem
hướng dẫn tham khảo.