.2 Yêu cầu cấp quyền truy xuất

Một phần của tài liệu Giáo trình lập trình di động trên iOS Dành cho bậc Cao đẳng (Trang 131 - 134)

Bài tập: Tìm hiểu và thực hiện tương tác với các Annotation!

4.2.6 Xác định vị trí và di chuyển trên bản đồ

Bài tập: Dựa trên kết quả mục 4.2.4 chúng ta ln lấy được vị trí hiện tại mà người dùng

đang đứng trên bản đồ. Sửa chương trình ở mục 4.2.4 để cho mỗi khi người sử dụng di chuyển thì toạ độ của vị trí hiện tại cũng di chuyển theo trên bản đồ đó và ta có thể thấy được hướng di chuyển của chính người dùng trên bản đồ đó.

124

Gợi ý: Sử dụng lệnh hiển thị vị trí hiện tại của người dùng trên bản đồ:

// Show the current location as a blue point mapView.showsUserLocation = true

4.2.7 Đánh dấu vị trí bằng sự kiện LongPressGesture

Một trong những thao tác thường hay được định nghĩa cho các ứng dụng trên di động đó là bắt sự kiện long press (Tap và giữ tay một lúc trên màn hình điện thoại). Thực

hiện như sau:

// For long press gesture

func addLongPressGesture(){ let longPressRecognizer:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action:#selector(handleLongPress(_:))) longPressRecognizer.minimumPressDuration = 1.0 mapView.addGestureRecognizer(longPressRecognizer) }

Trước tiên khai báo một đối tượng kiểu UILongPressGestureRecognizer trong đối tượng này sẽ truyền vào action là một selector trỏ đến hàm handleLongPress và mỗi khi xuất hiện sự kiện LongPress thì hàm đó sẽ được gọi. Hàm handleLongPress có tham số truyền vào là một UIGestureRecognizer cho phép nhận biết toạ độ của vị trí chỗ ngón tay tap trên bản đồ. Đơn giản nhất ta sẽ viết hàm này sao cho mỗi khi người dùng LongPress tại một vị trí trên bản đồ thì sẽ đánh dấu một Annotation tại vị trí đó:

@objc func handleLongPress(_ gestureRecognizer:UIGestureRecognizer){

// Get the position of user's touch point

let touchPoint = gestureRecognizer.location(in: mapView)

let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom:

mapView) markLocation = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude)

let annotation = MyMapAnnotation(coordinate:

markLocation!.coordinate, title: "You mark here!", subtitle: "") mapView.addAnnotation(annotation)

}

4.2.8 Chỉ đường

Chỉ đường là một công việc tương đối phức tạp cho các ứng dụng trên di động. Trong MapKit cần thực hiện các bước sau:

Bước 1: Đánh dấu điểm đi và điểm đến trên bản đồ map

let sourcePlaceMark = MKPlacemark(coordinate: sourceCoordinate,

addressDictionary: nil)

let destinationPlaceMark = MKPlacemark(coordinate:

Bước 2: Lấy MapItem cho điểm đi và điểm đến dựa trên kết quả bước 1.

let sourceMapItem = MKMapItem(placemark: sourcePlaceMark)

let destinationMapItem = MKMapItem(placemark: destinationPlaceMark)

Bước 3: Dựa trên các MapItem xác định các yêu cầu về hương cho điểm đi và điểm đến.

let directRequest = MKDirections.Request()

directRequest.source = sourceMapItem

directRequest.destination = destinationMapItem directRequest.transportType = .automobile

Bước 4: Tính tốn các điểm theo hướng đã xác định ở bước 3 và tiến hành vẽ đường đi.

let direction = MKDirections(request: directRequest)

direction.calculate { (response, error) in if error == nil {

if let route = response?.routes.first {

self.mapView.addOverlay(route.polyline, level: .aboveRoads) let rect = route.polyline.boundingMapRect

self.mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets.init(top: 40, left: 40, bottom: 20, right: 20), animated: true) }

} else {

print(error?.localizedDescription ?? "Unknown error!") }

}

Bước 5: Định nghĩa lại hàm vẽ nối điểm trên bản đồ với nét vẽ mầu xanh dương, độ

rộng nét vẽ 3:

// Draw the route

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) ->

MKOverlayRenderer {

let renderer = MKPolylineRenderer(overlay: overlay) renderer.strokeColor = UIColor.blue

renderer.lineWidth = 3.0 return renderer

}

Điều chỉnh lại hàm handleLongPress để mỗi khi sự kiện LongPress xuất hiện sẽ lấy toạ độ trên bản đồ của điệm được tap, thêm vào Annotation cho nó và thực hiện vẽ đường đi trong hàm chỉ đường 4 bước ở trên:

// Get the position of user's touch point

let touchPoint = gestureRecognizer.location(in: mapView)

let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom:

mapView)

markLocation = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude)

// Clear all previous Annotations

mapView.removeAnnotations(mapView.annotations)

126

addAnnotation(coordinate: touchCoordinate, title: meal.mealName, subtitle: "", type: MapAnnotationType.specific) }

else {

addAnnotation(coordinate: touchCoordinate, title: defaultMess, subtitle: "", type: MapAnnotationType.specific) }

mapView.removeOverlays(mapView.overlays)

routeFromSourceToDes(sourceCoordinate: (currentLocation?.coordinate)!, destinationCoordinate: touchCoordinate) Kết quả khi chạy chương trình (Hình 4.2.8.1):

Một phần của tài liệu Giáo trình lập trình di động trên iOS Dành cho bậc Cao đẳng (Trang 131 - 134)

Tải bản đầy đủ (PDF)

(137 trang)