Я предлагаю вам образец метода, чтобы кнопка на вашем булавке и дать пользователю направление булавки с приложением для карты Apple.
Прежде всего, после объявления вашего булавки, вы должны объявить кнопку, которая дает вам возможность взаимодействовать с пользователем в булавке (мы покажем позже, как инициализировать кнопку в булавке).
Вы можете объявить свою кнопку, как это:
let smallSquare = CGSize(width: 30, height: 30)
let button = UIButton(frame: CGRect(origin: CGPointZero, size: smallSquare))
Примечание, smallSquare
дать кнопку правильный размер кнопки вашего будущего булавочной.
Вы можете добавить изображение в кнопке булавочной с помощью метода: button.setBackgroundImage(UIImage(named: "car"), forState: .Normal)
.
Разработчик Apple дает нам некоторую документацию: Apple developer web site.
Тогда можно было действие кнопки с этим методом: button.addTarget(self, action: #selector(ViewController.getDirections), forControlEvents: .TouchUpInside)
. Итак, если кнопка выбрана нормально (.TouchUpInside
), программа вызывает функцию getDirection()
.
Теперь вы можете инициализировать кнопку в вашем штифтом с помощью метода: pinView?.leftCalloutAccessoryView = button
.
Примечание Этот метод устанавливает кнопку в левой части штифта. Вы можете поместить кнопку вправо следующим образом: pinView?.rightCalloutAccessoryView = button
.
Apple developer дать некоторую информацию по этому вопросу.
Однако, я не знаю, как инициализировать кнопку на полностью поверхности штифта.
Наконец, вы должны иметь функцию getDirections()
, чтобы дать пользователю «направление» штифта.
Я предлагаю вам использовать приложение для карты Apple для этой цели.
Моя функция getDirections()
выглядеть следующим образом:
func getDirections(){
guard let selectedPin = selectedPin else { return }
let mapItem = MKMapItem(placemark: selectedPin)
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
mapItem.openInMapsWithLaunchOptions(launchOptions)
print ("GET DIRECTION")
}
Я нахожу эту функцию в этом web site. Я думаю, это может объяснить это лучше меня.
В конце моя программа выглядит следующим образом:
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?{
guard !(annotation is MKUserLocation) else { return nil }
let reuseId = "pin"
var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
if pinView == nil {
pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
}
pinView?.pinTintColor = UIColor.orangeColor()
pinView?.canShowCallout = true
//The initialization of the pin. Here your program looks great.
// And after the code as seen above.
let smallSquare = CGSize(width: 30, height: 30)
let button = UIButton(frame: CGRect(origin: CGPointZero, size: smallSquare))
button.setBackgroundImage(UIImage(named: "car"), forState: .Normal)
button.addTarget(self, action: #selector(ViewController.getDirections), forControlEvents: .TouchUpInside)
pinView?.leftCalloutAccessoryView = button
return pinView
}
func getDirections(){
guard let selectedPin = selectedPin else { return }
let mapItem = MKMapItem(placemark: selectedPin)
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
mapItem.openInMapsWithLaunchOptions(launchOptions)
print ("GET DIRECTION")
}
Обычно, ваша программа должна выглядеть следующим образом:
func addPinOnMap(_ address: String) {
var hotelClass = PFObject(className: HOTEL_CLASS_NAME)
hotelClass = hotelArray[0]
if mapView.annotations.count != 0 {
annotation = mapView.annotations[0]
mapView.removeAnnotation(annotation)
}
// Make a search on the Map
localSearchRequest = MKLocalSearchRequest()
localSearchRequest.naturalLanguageQuery = address
localSearch = MKLocalSearch(request: localSearchRequest)
localSearch.start { (localSearchResponse, error) -> Void in
// Add PointAnnonation text and a Pin to the Map
self.pointAnnotation = MKPointAnnotation()
self.pointAnnotation.title = "\(hotelClass[HOTEL_NAME]!)"
self.pointAnnotation.coordinate = CLLocationCoordinate2D(latitude: localSearchResponse!.boundingRegion.center.latitude, longitude:localSearchResponse!.boundingRegion.center.longitude)
self.pinView = MKPinAnnotationView(annotation: self.pointAnnotation, reuseIdentifier: nil)
self.mapView.centerCoordinate = self.pointAnnotation.coordinate
self.mapView.addAnnotation(self.pinView.annotation!)
let smallSquare = CGSize(width: 30, height: 30)
let button = UIButton(frame: CGRect(origin: CGPointZero, size: smallSquare))
button.setBackgroundImage(UIImage(named: "car"), forState: .Normal)
button.addTarget(self, action: #selector(ViewController.getDirections), forControlEvents: .TouchUpInside)
self.pinView?.leftCalloutAccessoryView = button
// Zoom the Map to the location
self.region = MKCoordinateRegionMakeWithDistance(self.pointAnnotation.coordinate, 1000, 1000);
self.mapView.setRegion(self.region, animated: true)
self.mapView.regionThatFits(self.region)
self.mapView.reloadInputViews()
}
func getDirections(){
guard let selectedPin = selectedPin else { return }
let mapItem = MKMapItem(placemark: selectedPin)
let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
mapItem.openInMapsWithLaunchOptions(launchOptions)
print ("GET DIRECTION")
}
Извините, я не могу попробовать свой код, потому что я не твой полностью код, как объявление pinView.
Примечание, вам может понадобиться добавить эту строку кода для принятия, чем вывод может отображать выноску pinView?.canShowCallout = true
.
Вы можете проконсультироваться на этом сайте, если хотите получить более подробную информацию или сообщить мне свой комментарий.
Thorn technologies
Apple developer
Ваш совет был отличный, и все это работало на мой случай! Благодарим вас за то, что нашли время, чтобы помочь мне, теперь я могу успешно получить указания от моей кнопки на карте! –