2017-02-05 12 views
1

У меня есть приложение, которое отображает местоположение компании с помощью MKMapView. Когда пользователь посещает страницу контакта, в верхней части экрана появляется карта, в которой палец падает, и он показывает наше местоположение. Когда клик карты щелкнут, в аннотации отображается название компании.Быстро: добавьте кнопку направления, чтобы вывести аннотацию

Я вытаскиваю адрес компании в MKMApView из данных, хранящихся в моем обозревателе Parse, используя back4app.

У меня все работает отлично, однако, когда я нажимаю на вывод карты, и он показывает название компании, я также пытаюсь получить значок значка автомобиля, чтобы пользователь мог получить указания в нашей компании.

Вот код, я должен установить аннотацию:

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!) 

     // 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() 
    } 

} 

Я просто не знаю, как я могу получить значок кнопки в аннотациях и показывают направления по нажатию кнопки. либо с использованием текущего вида карты, либо для открытия приложения карт пользователей на своем устройстве, в любом случае это нормально.

спасибо.

ответ

2

Я предлагаю вам образец метода, чтобы кнопка на вашем булавке и дать пользователю направление булавки с приложением для карты 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

+1

Ваш совет был отличный, и все это работало на мой случай! Благодарим вас за то, что нашли время, чтобы помочь мне, теперь я могу успешно получить указания от моей кнопки на карте! –