MKPinAnnotationView没有显示标题

时间:2016-12-23 03:45:06

标签: ios swift3 mkmapview mkpinannotationview mkmapviewdelegate

我使用MKMapViewMKPointAnnotation过去有过一些经验,我曾经在地图上放了一些图钉。 这次我试图更进一步,使用MKPinAnnotationView,写一个标签和一些引脚。

不幸的是,它并没有像我期望的那样完成。

这是我想要做的:

我有一张地图(一个MKMapView对象),当我触摸它时,我在触摸点放了一个引脚,然后进行了一些计算,这给了我地图上的第二个点。我把第二个引脚(位于第二个点)放在最后一个引脚上,我想放一个标签,说" Hello Second!"。

以下是相关代码:

class ViewController: UIViewController, MKMapViewDelegate {
    var mapView:MKMapView!, touchPoint,secondPoint:MKPointAnnotation!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView = MKMapView()
        ...........
        let mapTap = UITapGestureRecognizer(target: self,
                                            action: #selector(ViewController.mapTouchHandler))
        mapView.addGestureRecognizer(mapTap)
    }


    func mapTouchHandler(gesture:UITapGestureRecognizer) {
        ...........
        // Compute map coordinates for the touch point (tapGeoPoint).

        if touchPoint == nil {
            touchPoint = MKPointAnnotation()
            mapView.addAnnotation(touchPoint);
        }

        touchPoint.coordinate = CLLocationCoordinate2D(latitude: tapGeoPoint.latitude,
                                                       longitude: tapGeoPoint.longitude)
        ...........
        computeSecondPoint(url: someComputedURL)
    }


    func computeSecondPoint(url searchURL:String) {
        let reqURL = NSURL(string: searchURL)!, session = URLSession.shared,
        task = session.dataTask(with: reqURL as URL) {
            (data: Data?, response: URLResponse?, error: Error?) in
            if error == nil {
                do {let allData = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
                    .................
                    // Compute map coordinates for the second point (secondPointCoord).

                    if self.secondPoint == nil {
                        self.secondPoint = MKPointAnnotation()
                        self.mapView.addAnnotation(self.secondPoint)
                    }

                    DispatchQueue.main.async {
                        () -> Void in
                        self.secondPoint.coordinate = CLLocationCoordinate2D(latitude: secondPointCoord.latitude,
                                                                             longitude: secondPointCoord.longitude)
                        self.secondPoint.title = "Hello Second!"
                    }
                } catch let error as NSError {print(error.localizedDescription)}
            } else {
                print("Error inside \(#function):\n\(error)")
            }
        }

        task.resume()

    }


    func mapView(_ mapView: MKMapView,
                 viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let identifier = "pin"
        var view: MKPinAnnotationView
        if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
            as? MKPinAnnotationView {
            dequeuedView.annotation = annotation
            view = dequeuedView
        } else {
            view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            view.canShowCallout = true
            view.calloutOffset = CGPoint(x: -5, y: 0)
        }
        return view
    }
}

现在发生的情况是,引脚按预期放置,但我没有在第二个上看到任何标签。 我还注意到,如果我点击第二个引脚所在的位置(在这种情况下,第二个引脚将保持在同一位置),则标签出现(应该始终如此)。如果我再次点击(不是那么近),那么标签会再次消失(尽管它不应该)。

我的代码(上图)中有什么东西不对吗? 任何相关的提示将不胜感激。

3 个答案:

答案 0 :(得分:1)

你在

中提到的标题
self.secondPoint.title = "Hello Second!"

是点击注释引脚时出现的标注视图的标题。如果您希望每次都可以将MKAnnotationView子类化,并在自定义引脚视图中添加标签,则需要显示标签和图像。您可以按以下方式自定义

class CustomAnnotationView : MKPinAnnotationView
{
    let helloLabel:UILabel = UILabel.init(frame:CGRectMake(0, 0, 100, 40)) //your desired frame

    func showLabel(title : String)
    {
        helloLabel.text = title
        helloLabel.textAlignment = .Center
        //set further properties
        self.addSubview(helloLabel)
    }

    fun hideLabel() {
        helloLabel.removeFromSuperview()
    }
}

答案 1 :(得分:0)

我已经使用了谷歌地图,但它应该适用于你...

let position = CLLocationCoordinate2DMake(latitude,longitude)
let location = GMSMarker(position: position)
location.icon = image
location.icon? = self.imageWithImage(image, scaledToSize: CGSize(width: 50.0, height: 50.0))
location.title = "the photo is clicked here!!"
location.map = MapView

答案 2 :(得分:0)

尝试此解决方案这将对您有所帮助

首先创建MyAnnotation引脚

if(geo_accuracy == "0")
            {
                colorofpin = .Blue
            }else if (geo_accuracy == "1")
            {
                colorofpin = .Red
            }else
            {
                colorofpin = .Green
            }
            var locationAnnotation = MyAnnotation(coordinate: location,
                title: p_user_name!,
                subtitle: "",
                pinColor: colorofpin,
                getTag:i)


            /* And eventually add them to the map */

            //aryNotation.addObject(locationAnnotation)

            aryNotation.append(locationAnnotation)

mapview委托方法

func mapView(mapView: MKMapView,
        viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?{

            if annotation is MyAnnotation == false{
                return nil
            }

            /* First typecast the annotation for which the Map View has
            fired this delegate message */
            let senderAnnotation = annotation as! MyAnnotation



            // --------------------------    For ios 9 -------------------


            let reuseId = "pin"
            var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)

            if pinView == nil {
                pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
                pinView!.canShowCallout = true

            }else{
                pinView!.annotation = annotation
            }
            pinView!.tag = senderAnnotation.getTag;

          //  print(senderAnnotation.getTag)

            if annotation is MyAnnotation {

                //print(senderAnnotation.pinColor)
                if(senderAnnotation.pinColor == .Red)
                {
                    if(currentIndex == senderAnnotation.getTag)
                    {
                        //print("currentIndex==\(currentIndex)********")
                        pinView!.image = UIImage(named: "jivemap_pin_rough_o.png")
                        pinView!.layer.zPosition = 1
                        pinView?.bringSubviewToFront(self.view)
                       // pinView!.superview!.bringSubviewToFront(view)
                    }else
                    {
                        pinView!.image = UIImage(named: "jivemap_pin_rough_g.png")
                        pinView!.layer.zPosition = 0
                    }
                }
                else
                {

                if(currentIndex == senderAnnotation.getTag)
                {
                    //print("currentIndex==*********\(currentIndex)********")
                    pinView!.image = UIImage(named: "jivemap_pin_o.png")
                    pinView!.layer.zPosition = 1


                }else
                {
                    pinView!.image = UIImage(named: "jivemap_pin_g.png")
                    pinView!.layer.zPosition = 0
                }
            }

                pinView!.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure) as UIView
              // pinView
               // return pinView
            }





            return pinView
            //return annotationView

    }

这是我的报废课。这堂课将满足你的所有问题

import UIKit
import MapKit

/* This will allow us to check for equality between two items
of type PinColor */
func == (left: PinColor, right: PinColor) -> Bool{
    return left.rawValue == right.rawValue
}

/* The various pin colors that our annotation can have */
enum PinColor : String{
    case Blue = "Blue"
    case Red = "Red"
    case Green = "Green"
    case Purple = "Purple"

    /* We will convert our pin color to the system pin color */
    func toPinColor() -> MKPinAnnotationColor{
        switch self{
        case .Red:
            return .Red
        case .Green:
            return .Green
        case .Purple:
            return .Purple
        default:
            /* For the blue pin, this will return .Red but we need
            to return *a* value in this function. For this case, we will
            ignore the return value */
            return .Red
        }
    }
}

class MyAnnotation: NSObject, MKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var title: String?
    var subtitle: String?
    var pinColor: PinColor!
    var getTag:Int!
    var annoationIndex = 0

    init(coordinate: CLLocationCoordinate2D,
        title: String,
        subtitle: String,
        pinColor: PinColor,
        getTag: Int){
            self.coordinate = coordinate
            self.title = title
            self.subtitle = subtitle
            self.pinColor = pinColor
            self.getTag = getTag
            super.init()
    }

    convenience init(coordinate: CLLocationCoordinate2D,
        title: String,
        subtitle: String,
        gettag: Int){
            self.init(coordinate: coordinate,
                title: title,
                subtitle: subtitle,
                pinColor: .Blue,
                getTag: gettag)
    }

}