MapKit iOS 9 detailCalloutAccessoryView用法

时间:2015-09-15 08:17:08

标签: ios mapkit mkannotationview

在观看WWDC video 206后,我认为将详细的标注视图添加到mapView注释视图是一项微不足道的任务。

所以,我认为我做错了什么。

设置了引脚视图

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

    let view:MKAnnotationView!

    if let dequed = routeMapView.dequeueReusableAnnotationViewWithIdentifier("pin") {
        view = dequed
    }
    else {
        view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
    }

    let x = UIView(frame: CGRectMake(0, 0, 200, 200))
    x.backgroundColor = UIColor.redColor()

    // shows the red
    //view.leftCalloutAccessoryView = x

    // working as no subtitle - but no red view
    view.detailCalloutAccessoryView = x

    view.canShowCallout = true
    return view
}

我只能得到这个

enter image description here

我知道该视图正在运行,因为如果我尝试使用leftCalloutAccessoryView我得到的 enter image description here

我一定错过了什么。请注意,如果我只是将图像添加到detailCalloutAccessoryView

view.detailCalloutAccessoryView = UIImage(named:"YourImageName")

图像在那里,尺寸正确等等

我无法弄清楚如何放入我自己的自定义视图。

由于

4 个答案:

答案 0 :(得分:20)

您必须为视图的宽度和高度添加一些约束:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    var av = mapView.dequeueReusableAnnotationViewWithIdentifier("id")
    if av == nil {
        av = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "id")
    }

    let myView = UIView()
    myView.backgroundColor = .greenColor()

    let widthConstraint = NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 40)
    myView.addConstraint(widthConstraint)

    let heightConstraint = NSLayoutConstraint(item: myView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 20)
    myView.addConstraint(heightConstraint)

    av!.detailCalloutAccessoryView = myView
    av!.canShowCallout = true

    return av!
}

Munich 1972

添加intrinsicContentSize也有效。

我做了一些测试并发现,当您将视图设置为translatesAutoresizingMaskIntoConstraints时,MapKit会自动将detailCalloutAccessoryView设置为false。

在WWDC 2015会议"What's New in MapKit"中,有人告诉我,“支持自动布局”。我认为Apple确实意味着你必须使用自动布局?!

答案 1 :(得分:13)

<强> 1。创建一个UIView并将其添加到故事板中的地图VC

enter image description here

在这里你可以设置大小,约束,添加按钮,图像等 - 布局你想要的方式。在这种情况下,堆栈视图非常完美。

<强> 2。创建并插入Maps VC

按照惯例,从自定义视图控制拖动。

@IBOutlet var customDetailView: UIView!

第3。为您的图钉设置detailCalloutAccessoryView

例如

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
    view.detailCalloutAccessoryView = customDetailView
}

<强>成功

enter image description here

答案 2 :(得分:-1)

使用UIImageView

view.detailCalloutAccessoryView = UIImageView(image:UIImage(named:"YourImageName")) 

答案 3 :(得分:-1)

您可以使用自定义类并覆盖intrinsicContentSize来根据其子级内容动态调整详细视图的大小。 (正如@Klaas在accepted answer中所暗示的那样)

如果视图的大小事先未知或在运行时更改,或者您只是不想以编程方式添加约束,这可能会特别有用。

这是在堆栈视图中使用两个标签的示例。 intrinsicContentSize设置为等于堆栈视图将采用的大小。将以下内容的实例设置为detailAccessoryView应该可以使您对标签文本的更改做出反应,并且不需要以编程方式添加约束。

class CustomCalloutDetailView : UIView {

    @IBOutlet weak var label1: UILabel!

    @IBOutlet weak var label2: UILabel!

    @IBOutlet weak var mainStack: UIStackView!

    override var intrinsicContentSize: CGSize {
        get {
            return mainStack.systemLayoutSizeFitting(UILayoutFittingCompressedSize)
        }
    }

    public func setLabel1(_ labelText: String) {
        self.label1.text = labelText
        self.invalidateIntrinsicContentSize()
    }
}