SWIFT 2: multiline MKPointAnnotation

狂风中的少年 提交于 2019-12-02 03:37:00

问题


Is there a way to create multiline annotations?

Here is my code:

1) My customAnnotation class

import UIKit
import MapKit

class CustomAnnotation: NSObject, MKAnnotation {

    var title: String?
    var subtitle: String?
    var address: String = ""
    var phoneNumber: String = ""
    var workingHours: String = ""
    var coordinate: CLLocationCoordinate2D


    init(   title: String,
            subtitle: String,
            address: String,
            phoneNumber: String,
            workingHours: String,
            coordinate: CLLocationCoordinate2D ){

        self.title = title
        self.subtitle = subtitle
        self.address = address
        self.phoneNumber = phoneNumber
        self.workingHours = workingHours
        self.coordinate = coordinate

        super.init()
    }
}

2) my view controller with map:

class MapViewController: UIViewController, MKMapViewDelegate {

@IBOutlet weak var theMapView: MKMapView!

override func viewDidLoad() {
    super.viewDidLoad()


            let latitude: CLLocationDegrees = 54.685290
            let longitude : CLLocationDegrees = 25.279661

            let latDelta : CLLocationDegrees = 0.2
            let lonDelta : CLLocationDegrees = 0.2

            let theSpan : MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

            let branchLocation : CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)

            let theRegion : MKCoordinateRegion = MKCoordinateRegionMake(branchLocation, theSpan)


            let annotation = CustomAnnotation(title: "Brach1", subtitle: "some text for B1", address: "address str 12-12", phoneNumber: "123 321 123", workingHours: "00 - 24", coordinate: branchLocation)


            self.theMapView.setRegion(theRegion, animated: true)

            self.theMapView.addAnnotation(annotation)

        }


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}


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

    let identifier = "MyPin"

    if annotation.isKindOfClass(MKUserLocation) {
        return nil
    }

    var annotationView: MKPinAnnotationView? = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) as? MKPinAnnotationView

    if annotationView == nil {

        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        annotationView?.canShowCallout = true

        let multiLineView = UIView(frame: CGRectMake(0, 0, 100, 40))

        let label1 = UILabel(frame: CGRectMake(0,0,100,20))
        label1.text = "Some text1"
        multiLineView.addSubview(label1)

        let label2 = UILabel(frame: CGRectMake(0,20,100,20))
        label2.text = "some text2"
        multiLineView.addSubview(label2)

        annotationView!.rightCalloutAccessoryView = multiLineView

    } else {
        annotationView!.annotation = annotation
    }
return annotationView
}

}

What I get:

If I would use

annotationView!.leftCalloutAccessoryView = multiLineView

I would get:

I haven't found any other methods. I would expect something like bottomCalouttAccessoryView to get something like:

That is very wired for me that the height of annotation is not amendable. (that is why my three lables don't even fit there) I was trying to play with autoresize methods of annotationview but with no luck:(


回答1:


have you looked at: How to display 2 lines of text for subtitle of MKAnnotation and change the image for the button on the right?

especially this part (I converted it to Swift for you)

   var multiLineView= UIView(frame: CGRectMake(0, 0, 23, 23))
    multiLineView.addSubview(lable1)
    multiLineView.addSubview(lable2)
    annotationView.leftCalloutAccessoryView = multiLineView

UPDATE

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

var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier("pin")

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

    // create a new View
    var multiLineView= UIView(frame: CGRectMake(0, 0, 23, 23))
    // add all the labels you need here
    let label1 = UILabel(frame: CGRectMake(0,10,10,10))
    label1.text = "Some text"
    multiLineView.addSubview(label1)
    let label2 = UILabel(frame: CGRectMake(0,20,10,10))
    label2.text = "some text"
    multiLineView.addSubview(label2)
    pinView!.leftCalloutAccessoryView = multiLineView


}
else {
    pinView!.annotation = annotation
}

return pinView

}




回答2:


The subtitle is a string that prints to a single line label, you would likely have to make a subclass in order to add multiple lines.




回答3:


plz use this i programmatically set NSLayoutConstraint.

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

        let identifier = "MyPin"

        if annotation.isKindOfClass(MKUserLocation) {
            return nil
        }

        var annotationView: MKPinAnnotationView? = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) as? MKPinAnnotationView

        if annotationView == nil {

            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            annotationView?.canShowCallout = true

              let label1 = UILabel(frame: CGRectMake(0, 0, 200, 21))
            label1.text = "Some text1 some text2 some text2 some text2 some text2 some text2 some text2"
             label1.numberOfLines = 0
              annotationView!.detailCalloutAccessoryView = label1;

            let width = NSLayoutConstraint(item: label1, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 200)
            label1.addConstraint(width)


            let height = NSLayoutConstraint(item: label1, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 90)
            label1.addConstraint(height)



        } else {
            annotationView!.annotation = annotation
        }
        return annotationView
    }


}

and output



来源:https://stackoverflow.com/questions/37446219/swift-2-multiline-mkpointannotation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!