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