Sự kiện

Chọn nền tảng: Android iOS JavaScript

Khi sử dụng SDK Maps dành cho iOS, bạn có thể nghe những sự kiện xảy ra trên bản đồ, chẳng hạn như các sự kiện thay đổi về máy ảnh hoặc sự kiện nhấn vào điểm đánh dấu.

Giới thiệu

Để theo dõi các 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 đồ. Dưới đây là 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 ủy quyền cho trình kiểm soát chế độ xem của mình. GMSMapViewDelegate chỉ cung cấp các phương thức không bắt buộc. Để theo dõi 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 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í máy ảnh

Khi sử dụng GMSMapViewDelegate, bạn có thể theo dõi các thay đổi đối với vị trí máy ảnh dùng để kết xuất bản đồ. Có 3 sự kiện riêng biệt.

  • mapView:willMove: cho biết rằng vị trí máy ảnh sắp thay đổi. Nếu đối số gesture được đặt thành YES, điều này là do người dùng thực hiện một cử chỉ tự nhiên trên GMSMapView, 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 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 đồ. Đây cũng có thể là NO nếu người dùng đã nhấn vào nút Vị trí của tôi hoặc nút la bàn, thao tác này tạo ra ảnh động thay đổi máy ảnh.

    Phương thức này có thể được gọi vài lần trước khi mapView:idleAtCameraPosition: được gọi, mặc dù điều này thường xảy ra nếu ảnh động và cử chỉ xảy ra cùng một lúc – chẳng hạn, một cử chỉ sẽ huỷ mọi ảnh động hiện tại và sẽ gọi mapView: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 khi gọi hàm mapView:willMove:. Nó được truyền vị trí máy ảnh trung gian.

  • Cuối cùng, mapView:idleAtCameraPosition: được gọi khi vị trí máy ảnh trên GMSMapView chuyển sang trạng thái rảnh và chỉ định vị trí máy ảnh liên quan. Tại thời điểm này, tất cả ảnh động và cử chỉ đã dừng lại.

    Các ứng dụng có thể sử dụng sự kiện này để kích hoạt quá trình làm mới điểm đánh dấu hoặc nội dung khác được hiển thị trên GMSMapView, thay vì ví dụ: tải lại nội dung trên mọi thay đổi của máy ảnh.

Ví dụ: một ứng dụng có thể xoá GMSMapView khi đang di chuyển, sau đó mã hoá ngược vị trí mà máy ảnh lưu 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, các địa điểm yêu thích (CUE) 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, tòa nhà chính phủ và các địa điểm khác, cũng như địa điểm yêu thích của 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 chuột trên 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.