在swift iOS地图应用程序中创建动态子视图

在swift iOS地图应用程序中创建动态子视图,ios,swift,Ios,Swift,这是我第一次涉足应用程序领域,因此需要进行大量研究才能达到这一点。我正在构建一个地图应用程序,并打算创建一个类似于下面所示的zillow应用程序的界面。我正试图找到一种正确的方法,允许我点击地图注释,它会显示一个更小的视图,我可以在其中与之交互。因此,基本上我有几个问题: 我应该在地图控制器内使用子视图,还是使用容器视图。或者有没有其他我没见过的方法 如何将数据从注释推送到该函数 如何在单击批注之前隐藏此子视图 到目前为止,这是我能找到的最接近的东西: 谢谢 我也是iOS新手,但我做了一些类似于

这是我第一次涉足应用程序领域,因此需要进行大量研究才能达到这一点。我正在构建一个地图应用程序,并打算创建一个类似于下面所示的zillow应用程序的界面。我正试图找到一种正确的方法,允许我点击地图注释,它会显示一个更小的视图,我可以在其中与之交互。因此,基本上我有几个问题:

  • 我应该在地图控制器内使用子视图,还是使用容器视图。或者有没有其他我没见过的方法

  • 如何将数据从注释推送到该函数

  • 如何在单击批注之前隐藏此子视图

  • 到目前为止,这是我能找到的最接近的东西:

    谢谢


    我也是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
          }
        }
      }
    
    注:
    我试图从我的代码中复制并简化这一点,它实际上试图同时支持苹果和谷歌地图,所以希望我没有任何打字错误,但我认为这是我所采取步骤的一个很好的代表

    还有几件事需要注意:

  • 我想你必须为注释提供一个标题
  • 我认为您必须将视图的canShowCallout设置为false

  • 我想这两个要求都可以在文档中找到,但我现在没有指向这一点的指针。

    我对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
          }
        }
      }
    
    注:
    我试图从我的代码中复制并简化这一点,它实际上试图同时支持苹果和谷歌地图,所以希望我没有任何打字错误,但我认为这是我所采取步骤的一个很好的代表

    还有几件事需要注意:

  • 我想你必须为注释提供一个标题
  • 我认为您必须将视图的canShowCallout设置为false

  • 我认为这两个要求都可以在文档中找到,但我现在没有指向这一点的指针。

    这对我来说确实有效。但事实证明,我想要的是地图顶部带有嵌入序列的容器视图。谢谢你的帮助@nPn!这确实对我有用。但事实证明,我想要的是地图顶部带有嵌入序列的容器视图。谢谢你的帮助@nPn!