2016-12-01 1 views
0

에 대한 sourceView로 MGLAnnotationView을 설정하는 방법 ,하지만 전혀 실행되지 않는 것 같습니다. 지금은 단지 didSelect 주석를 통해 내 팝 오버를 제시하고있어 그냥 어딘가에을 보여주는, 줄을 탐색 할 수있는 sourceView을 설정 한 내용은 ... 참고로내가하고 싶은 것은 내가 이것을 달성 할 수 있어야한다 위임 기능 <strong>didSelect annotationView</strong>을 사용하여 소스보기/앵커</strong></p> <p>과 주석과 팝 오버를 제시 <strong>입니다 팝 오버

: 나는 프로젝트에 Mapbox SDK을 구현 한 . MapKit을 사용하여 동일한 작업을 수행하는 데 문제가 없습니다.

아무에게도 이것을 달성하기 위해 내가 할 수있는 일이 있습니까?

아래 코드 스 니펫 : 선택할 수있는 주석보기,이 없기 때문에

import UIKit 
import Mapbox 

class ViewController: UIViewController, MGLMapViewDelegate, UIPopoverPresentationControllerDelegate { 

@IBOutlet var theMap: MGLMapView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    theMap.delegate = self 

    let point = MGLPointAnnotation() 
    point.coordinate = CLLocationCoordinate2D(latitude: 55.6, longitude: 13.0) 
    point.title = "Some place" 
    point.subtitle = "Malmö, Sweden" 
    theMap.addAnnotation(point) 
} 

func mapView(_ mapView: MGLMapView, didSelect annotationView: MGLAnnotationView) { 
    print("annotation view: ", annotationView) 
    // this method doesn't seem to get called at all... 
    // but ideally this is the place to present the popover. 
} 

func mapView(_ mapView: MGLMapView, didSelect annotation: MGLAnnotation) { 
    print("annotation: ", annotation) 
    // present the popover 
    presentPopover() 
} 

func presentPopover(){ 
    let popover = storyboard?.instantiateViewController(withIdentifier: "MyCalloutVC") as! MyCallout 

    popover.modalPresentationStyle = UIModalPresentationStyle.popover 
    popover.popoverPresentationController?.backgroundColor = UIColor.white 
    popover.popoverPresentationController?.delegate = self 

    // I would like to set the source anchor to the selected annotation view. 
    popover.popoverPresentationController?.sourceView = UINavigationBar() // set to nav bar for now... 
    popover.popoverPresentationController?.permittedArrowDirections = .any 
    // popover size set in MyCallout 
    self.present(popover, animated: true) 
    } 
} 

답변

0

함수가 호출되지 않습니다. 즉, 주석보기가 아닌 단순히 지점 주석 만 추가하면됩니다. 따라서 다음을 수행해야합니다. 주석을 추가하면 func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {}이 호출됩니다. 여기서 주석보기를 정의하고 반환 할 수 있습니다. 그런 다음 선택한 함수가 호출됩니다. 예제 코드를 살펴보십시오. https://www.mapbox.com/ios-sdk/examples/annotation-views/

import Mapbox 

// Example view controller 
class ViewController: UIViewController, MGLMapViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let mapView = MGLMapView(frame: view.bounds) 
     mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
     mapView.styleURL = MGLStyle.darkStyleURL(withVersion: 9) 
     mapView.tintColor = .lightGray 
     mapView.centerCoordinate = CLLocationCoordinate2D(latitude: 0, longitude: 66) 
     mapView.zoomLevel = 2 
     mapView.delegate = self 
     view.addSubview(mapView) 

     // Specify coordinates for our annotations. 
     let coordinates = [ 
      CLLocationCoordinate2D(latitude: 0, longitude: 33), 
      CLLocationCoordinate2D(latitude: 0, longitude: 66), 
      CLLocationCoordinate2D(latitude: 0, longitude: 99), 
     ] 

     // Fill an array with point annotations and add it to the map. 
     var pointAnnotations = [MGLPointAnnotation]() 
     for coordinate in coordinates { 
      let point = MGLPointAnnotation() 
      point.coordinate = coordinate 
      point.title = "\(coordinate.latitude), \(coordinate.longitude)" 
      pointAnnotations.append(point) 
     } 

     mapView.addAnnotations(pointAnnotations) 
    } 

    // MARK: - MGLMapViewDelegate methods 

    // This delegate method is where you tell the map to load a view for a specific annotation. To load a static MGLAnnotationImage, you would use `-mapView:imageForAnnotation:`. 
    func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? { 
     // This example is only concerned with point annotations. 
     guard annotation is MGLPointAnnotation else { 
      return nil 
     } 

     // Use the point annotation’s longitude value (as a string) as the reuse identifier for its view. 
     let reuseIdentifier = "\(annotation.coordinate.longitude)" 

     // For better performance, always try to reuse existing annotations. 
     var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) 

     // If there’s no reusable annotation view available, initialize a new one. 
     if annotationView == nil { 
      annotationView = CustomAnnotationView(reuseIdentifier: reuseIdentifier) 
      annotationView!.frame = CGRect(x: 0, y: 0, width: 40, height: 40) 

      // Set the annotation view’s background color to a value determined by its longitude. 
      let hue = CGFloat(annotation.coordinate.longitude)/100 
      annotationView!.backgroundColor = UIColor(hue: hue, saturation: 0.5, brightness: 1, alpha: 1) 
     } 

     return annotationView 
    } 

    func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool { 
     return true 
    } 
} 

// 
// MGLAnnotationView subclass 
class CustomAnnotationView: MGLAnnotationView { 
    override func layoutSubviews() { 
     super.layoutSubviews() 

     // Force the annotation view to maintain a constant size when the map is tilted. 
     scalesWithViewingDistance = false 

     // Use CALayer’s corner radius to turn this view into a circle. 
     layer.cornerRadius = frame.width/2 
     layer.borderWidth = 2 
     layer.borderColor = UIColor.white.cgColor 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Animate the border width in/out, creating an iris effect. 
     let animation = CABasicAnimation(keyPath: "borderWidth") 
     animation.duration = 0.1 
     layer.borderWidth = selected ? frame.width/4 : 2 
     layer.add(animation, forKey: "borderWidth") 
    } 
} 
+0

설명 답, 적절한 정보를 주셔서 감사합니다. ppoh71! 나는 지금 가고있다. –

관련 문제