在观看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
}
我只能得到这个
我知道该视图正在运行,因为如果我尝试使用leftCalloutAccessoryView
我得到的
我一定错过了什么。请注意,如果我只是将图像添加到detailCalloutAccessoryView
view.detailCalloutAccessoryView = UIImage(named:"YourImageName")
图像在那里,尺寸正确等等
我无法弄清楚如何放入我自己的自定义视图。
由于
答案 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!
}
添加intrinsicContentSize
也有效。
我做了一些测试并发现,当您将视图设置为translatesAutoresizingMaskIntoConstraints
时,MapKit会自动将detailCalloutAccessoryView
设置为false。
在WWDC 2015会议"What's New in MapKit"中,有人告诉我,“支持自动布局”。我认为Apple确实意味着你必须使用自动布局?!
答案 1 :(得分:13)
<强> 1。创建一个UIView并将其添加到故事板中的地图VC
在这里你可以设置大小,约束,添加按钮,图像等 - 布局你想要的方式。在这种情况下,堆栈视图非常完美。
<强> 2。创建并插入Maps VC
按照惯例,从自定义视图控制拖动。
@IBOutlet var customDetailView: UIView!
第3。为您的图钉设置detailCalloutAccessoryView
例如
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
view.detailCalloutAccessoryView = customDetailView
}
<强>成功强>
答案 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()
}
}