Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用google maps ios sdk和swiftui的自定义标记信息窗口_Swift_Google Maps_Uiview_Google Maps Markers_Swiftui - Fatal编程技术网

使用google maps ios sdk和swiftui的自定义标记信息窗口

使用google maps ios sdk和swiftui的自定义标记信息窗口,swift,google-maps,uiview,google-maps-markers,swiftui,Swift,Google Maps,Uiview,Google Maps Markers,Swiftui,在我的应用程序中,当使用谷歌地图和快速用户界面点击一个标记(GMSMarker)时,我试图创建一个自定义信息窗口 我在这里引用了谷歌的文档: 目前,我可以通过返回UIView在GMSMapViewDelegate上使用“markerInfoWindow”方法显示自定义信息窗口,但由于我的几乎所有应用程序都是使用swiftui视图构建的,因此我希望能够显示现有的swiftui视图,而不是将视图重新创建为UIView 下面是我当前的函数,它创建一个基本的UIView,然后将其显示为信息窗口(它是一个

在我的应用程序中,当使用谷歌地图和快速用户界面点击一个标记(GMSMarker)时,我试图创建一个自定义信息窗口

我在这里引用了谷歌的文档:

目前,我可以通过返回UIView在GMSMapViewDelegate上使用“markerInfoWindow”方法显示自定义信息窗口,但由于我的几乎所有应用程序都是使用swiftui视图构建的,因此我希望能够显示现有的swiftui视图,而不是将视图重新创建为UIView

下面是我当前的函数,它创建一个基本的UIView,然后将其显示为信息窗口(它是一个带有文本的灰色框):

以下是我希望能够显示的swiftui视图:

import SwiftUI
import UIKit

struct MarkerInfoWindow: View {
    var body: some View {

        HStack {
            Text("Image here")

            VStack {
                Text("Content 1")
                Text("Content 2")

            }

            Text("button here")
        }

    }
}
我是swift的新手,因此这对于经验丰富的开发人员来说可能是显而易见的,但是有什么方法可以将我的swiftui视图作为UIView返回,以便在信息窗口中显示它吗?


或者,如果这是我唯一的选择,是否有一种方法可以轻松设置我的UIView的样式,使其可以是HSTACK和VSTACK的混合体?

我认为在这种情况下,您可以使用
UIHostingController
。我没有在谷歌地图上尝试过这个,因为我没有一个项目使用它们,但它至少可以给你一个起点

要使用
UIHostingController
,我们可以传递要使用的
SwiftUI
视图。您可以在
SwiftUI
中设置其大小的样式,也可以在详图索引中添加框架

func映射视图(映射视图:GMSMapView,markerinfowindowmarker:GMSMarker)->UIView{
打印(“显示标记信息窗口”)
let callout=UIHostingController(rootView:MarkerInfoWindow())
callout.view.frame=CGRect(x:0,y:0,宽度:self.view.frame.width-48,高度:200)
返回callout.view
}
您的
MarkerInfoWindow
看起来您计划在其中添加一个按钮,我不确定您将如何实现这一点,这可能是在
SwiftUI
代码中添加一个按钮的简单情况,尽管我从过去的经验中知道,如果按钮不在一个标注附件内,则很难与标注交互


这是我在
MapKit
中显示详图索引所做的操作

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    let callout = UIHostingController(rootView: MarkerInfoWindow())
    callout.view.frame = CGRect(x: 0, y: 0, width: mapView.frame.width - 48, height: 200)
    view.addSubview(callout.view)
}

我认为您可以在这种情况下使用
UIHostingController
。我没有在谷歌地图上尝试过这个,因为我没有一个项目使用它们,但它至少可以给你一个起点

要使用
UIHostingController
,我们可以传递要使用的
SwiftUI
视图。您可以在
SwiftUI
中设置其大小的样式,也可以在详图索引中添加框架

func映射视图(映射视图:GMSMapView,markerinfowindowmarker:GMSMarker)->UIView{
打印(“显示标记信息窗口”)
let callout=UIHostingController(rootView:MarkerInfoWindow())
callout.view.frame=CGRect(x:0,y:0,宽度:self.view.frame.width-48,高度:200)
返回callout.view
}
您的
MarkerInfoWindow
看起来您计划在其中添加一个按钮,我不确定您将如何实现这一点,这可能是在
SwiftUI
代码中添加一个按钮的简单情况,尽管我从过去的经验中知道,如果按钮不在一个标注附件内,则很难与标注交互


这是我在
MapKit
中显示详图索引所做的操作

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    let callout = UIHostingController(rootView: MarkerInfoWindow())
    callout.view.frame = CGRect(x: 0, y: 0, width: mapView.frame.width - 48, height: 200)
    view.addSubview(callout.view)
}

谢谢你的帮助!为了简单起见,我想我会更改视图,使其具有信息性,而不包括按钮。但我复制了上面的代码,并不断得到错误“无法将'UIView'类型的值分配给'CGRect'类型”。我尝试将callout的view和view.frame设置为UIView(),但没有成功。你有什么想法吗?对不起,那是我的错,从我的
MapKit
设置转换到你的
GoogleMap
时出现了复制和粘贴错误。它应该是
UIView
中包含的
CGRect
。我已经更新了代码。谢谢你的帮助!为了简单起见,我想我会更改视图,使其具有信息性,而不包括按钮。但我复制了上面的代码,并不断得到错误“无法将'UIView'类型的值分配给'CGRect'类型”。我尝试将callout的view和view.frame设置为UIView(),但没有成功。你有什么想法吗?对不起,那是我的错,从我的
MapKit
设置转换到你的
GoogleMap
时出现了复制和粘贴错误。它应该是
UIView
中包含的
CGRect
。我已经更新了代码。