Khi sử dụng SDK bản đồ dành cho iOS, bạn có thể theo dõi 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 sẽ triển khai giao thức này trên bộ điều khiển chế độ xem hiển thị bản đồ. Dưới đâ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 trình uỷ quyền của nó thành trình điều khiển khung hiển thị. GMSMapViewDelegate chỉ cung cấp các phương thức không bắt buộc. Để nghe bất kỳ sự kiện cụ thể nào, bạn phải triển khai phương thức liên quan.
Swift
override func loadView() { super.loadView() let camera = GMSCameraPosition.camera( withLatitude: 1.285, longitude: 103.848, zoom: 12 ) let options = GMSMapViewOptions() options.camera = camera let mapView = GMSMapView(options: options) 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]; GMSMapViewOptions *options = [[GMSMapViewOptions alloc] init]; options.camera = camera; GMSMapView *mapView = [[GMSMapView alloc] initWithOptions:options]; 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ể theo dõi các 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í camera sắp thay đổi. Nếu đối sốgestuređược đặt thànhYES, thì điều này là do người dùng thực hiện một cử chỉ tự nhiên trênGMSMapView, chẳng hạn như lia hoặc nghiêng. Nếu không,NOcho biết đây là một phần của 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 lớp của bản đồ. Giá trị này cũng có thể làNOnếu người dùng đã nhấn vào nút Vị trí của tôi hoặc nút la bàn, tạo ra ảnh động thay đổi máy ảnh.Phương thức này có thể được gọi nhiều lần trước khi
mapView:idleAtCameraPosition:được gọi, mặc dù điều này thường chỉ xảy ra nếu ảnh động và cử chỉ xảy ra cùng một lúc – ví dụ: một cử chỉ sẽ huỷ mọi ảnh động hiện tại và sẽ gọimapView:willMove:lần thứ hai.mapView:didChangeCameraPosition:được gọi nhiều lần trong một cử chỉ hoặc ảnh động, luôn sau lệnh gọi đếnmapView:willMove:. Hàm này nhận được vị trí camera trung gian.Cuối cùng,
mapView:idleAtCameraPosition:được gọi khi vị trí camera trênGMSMapViewở trạng thái rảnh và chỉ định vị trí camera có liên quan. Tại thời điểm này, tất cả ảnh động và cử chỉ đều đã dừng.Ứng dụng có thể sử dụng sự kiện này để kích hoạt việc làm mới điểm đánh dấu hoặc nội dung khác đang hiển thị trên
GMSMapView, thay vì tải lại nội dung mỗi khi camera thay đổi.
Ví dụ: một ứng dụng có thể xoá GMSMapView khi di chuyển, sau đó
mã hoá địa lý 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
static 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, các địa điểm yêu thích (POI) sẽ xuất hiện trên bản đồ cơ sở cùng với biểu tượng tương ứ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à nhiều địa điểm khác, cũng như các địa điểm yêu thích là doanh nghiệp 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 vào một địa điểm yêu thích. Hãy 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 về danh sách đầy đủ các phương thức trên GMSMapViewDelegate, hãy xem hướng dẫn tham khảo.