在swift iOS地图应用程序中创建动态子视图
这是我第一次涉足应用程序领域,因此需要进行大量研究才能达到这一点。我正在构建一个地图应用程序,并打算创建一个类似于下面所示的zillow应用程序的界面。我正试图找到一种正确的方法,允许我点击地图注释,它会显示一个更小的视图,我可以在其中与之交互。因此,基本上我有几个问题:在swift iOS地图应用程序中创建动态子视图,ios,swift,Ios,Swift,这是我第一次涉足应用程序领域,因此需要进行大量研究才能达到这一点。我正在构建一个地图应用程序,并打算创建一个类似于下面所示的zillow应用程序的界面。我正试图找到一种正确的方法,允许我点击地图注释,它会显示一个更小的视图,我可以在其中与之交互。因此,基本上我有几个问题: 我应该在地图控制器内使用子视图,还是使用容器视图。或者有没有其他我没见过的方法 如何将数据从注释推送到该函数 如何在单击批注之前隐藏此子视图 到目前为止,这是我能找到的最接近的东西: 谢谢 我也是iOS新手,但我做了一些类似于
我也是iOS新手,但我做了一些类似于您想做的事情。我有一个视图显示一些统计数据、速度、方位等。当有人单击注释时,我切换显示和隐藏统计数据。也许有更好的方法,但我就是这么做的 “您的问题的执行摘要” 1和3)在隐藏和取消隐藏的地图上使用子视图 2) 同时为MKAnnotation和MKAnnotationView创建子类。将要传递的数据放入子类MKAnnotationView的属性中,然后在创建该属性时将其传输到MKAnnotationView。然后,您可以从传递到didSelectAnnotationView的视图中检索它 细节 1) 3)我创建了一个子视图,该子视图位于mapView上,并最初将其设置为隐藏在故事板中。然后我有一个toggeleMarkerStatistics()函数 用于切换视图可见性的选项。像这样的
func toggleMarkerStatistics() {
if mapMarkerStatistics.hidden {
mapMarkerStatistics.hidden = false
} else {
mapMarkerStatistics.hidden = true
}
}
此函数是从内部调用的
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { }
2) 要将数据导入didSelectAnnotationView,以下是我所做的。
我对MKAnnotation和MKAnnotationView都进行了子类化,并添加了属性来保存我想要传递给didSelectAnnotationView的数据。比如说:
class MyAnnotation: MKPointAnnotation {
var myMarker: MyMapMarker?
}
class MyMKAnnotationView: MKAnnotationView {
var myMarker: MyMapMarker?
}
创建注释时,请在将注释添加到地图之前设置特性
let annotation = MyAnnotation()
annotation.myMarker = marker
annotation.coordinate = location
annotation.title = "btw, you MUST have a title or bad things happen"
mapView.addAnnotation(annotation)
然后,在viewForAnnotation中,将为您提供自定义注释以及创建注释后设置的属性,并要求您为此注释创建视图。现在,在创建此视图时,请在返回视图之前将“视图”属性设置为“注释”属性。现在,要传递给didSelectAnnotationView的数据将在传递给didSelectAnnotationView的视图上可用
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let view: MKAnnotationView! = mapView.dequeueReusableAnnotationViewWithIdentifier("marker") ?? MyMKAnnotationView(annotation: annotation, reuseIdentifier: "marker")
view.annotation = annotation
view.canShowCallout = false // you need this to make this work
if let annotation = annotation as? MyAnnotation {
if let view = view as? MyMKAnnotationView {
view.myMarker = annotation.myMarker
}
}
return view
}
现在,在didSelectAnnotationView中,检索创建注释时设置的数据:
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
if let view = view as? MyMKAnnotationView {
if let marker = view.myMarker {
toggleMarkerStatistics() // hide or unhide the view
// do something with your data
}
}
}
注:我试图从我的代码中复制并简化这一点,它实际上试图同时支持苹果和谷歌地图,所以希望我没有任何打字错误,但我认为这是我所采取步骤的一个很好的代表 还有几件事需要注意:
我想这两个要求都可以在文档中找到,但我现在没有指向这一点的指针。我对iOS也不熟悉,但我做了一些类似于您想要做的事情。我有一个视图显示一些统计数据、速度、方位等。当有人单击注释时,我切换显示和隐藏统计数据。也许有更好的方法,但我就是这么做的 “您的问题的执行摘要” 1和3)在隐藏和取消隐藏的地图上使用子视图 2) 同时为MKAnnotation和MKAnnotationView创建子类。将要传递的数据放入子类MKAnnotationView的属性中,然后在创建该属性时将其传输到MKAnnotationView。然后,您可以从传递到didSelectAnnotationView的视图中检索它 细节 1) 3)我创建了一个子视图,该子视图位于mapView上,并最初将其设置为隐藏在故事板中。然后我有一个toggeleMarkerStatistics()函数 用于切换视图可见性的选项。像这样的
func toggleMarkerStatistics() {
if mapMarkerStatistics.hidden {
mapMarkerStatistics.hidden = false
} else {
mapMarkerStatistics.hidden = true
}
}
此函数是从内部调用的
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { }
2) 要将数据导入didSelectAnnotationView,以下是我所做的。
我对MKAnnotation和MKAnnotationView都进行了子类化,并添加了属性来保存我想要传递给didSelectAnnotationView的数据。比如说:
class MyAnnotation: MKPointAnnotation {
var myMarker: MyMapMarker?
}
class MyMKAnnotationView: MKAnnotationView {
var myMarker: MyMapMarker?
}
创建注释时,请在将注释添加到地图之前设置特性
let annotation = MyAnnotation()
annotation.myMarker = marker
annotation.coordinate = location
annotation.title = "btw, you MUST have a title or bad things happen"
mapView.addAnnotation(annotation)
然后,在viewForAnnotation中,将为您提供自定义注释以及创建注释后设置的属性,并要求您为此注释创建视图。现在,在创建此视图时,请在返回视图之前将“视图”属性设置为“注释”属性。现在,要传递给didSelectAnnotationView的数据将在传递给didSelectAnnotationView的视图上可用
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let view: MKAnnotationView! = mapView.dequeueReusableAnnotationViewWithIdentifier("marker") ?? MyMKAnnotationView(annotation: annotation, reuseIdentifier: "marker")
view.annotation = annotation
view.canShowCallout = false // you need this to make this work
if let annotation = annotation as? MyAnnotation {
if let view = view as? MyMKAnnotationView {
view.myMarker = annotation.myMarker
}
}
return view
}
现在,在didSelectAnnotationView中,检索创建注释时设置的数据:
func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
if let view = view as? MyMKAnnotationView {
if let marker = view.myMarker {
toggleMarkerStatistics() // hide or unhide the view
// do something with your data
}
}
}
注:我试图从我的代码中复制并简化这一点,它实际上试图同时支持苹果和谷歌地图,所以希望我没有任何打字错误,但我认为这是我所采取步骤的一个很好的代表 还有几件事需要注意:
我认为这两个要求都可以在文档中找到,但我现在没有指向这一点的指针。这对我来说确实有效。但事实证明,我想要的是地图顶部带有嵌入序列的容器视图。谢谢你的帮助@nPn!这确实对我有用。但事实证明,我想要的是地图顶部带有嵌入序列的容器视图。谢谢你的帮助@nPn!