我有一个google地图,正在将marker.iconView设置为自定义UIView。
marker.iconView = customUIView()
func customUIView()-> UIView
{
var theView:UIView
theView.isUserInteractionEnabled = true
let gesture = UITapGestureRecognizer(target: self, action:
#selector (self.popAction(sender:)))
theView.addGestureRecognizer(gesture)
}
UIView几乎只是一个文本框,当点击UIView时,popAction不会弹出一个窗口。
但我无法让手势功能正常工作,我想知道是不是因为这个手势是在谷歌地图上注册的,而不是在UIView上。
****更新*****
在阅读了google文档之后,我确信我不能在marker.iconView中添加一个手势,因为UIView只是一个“快照”
相反,我正在实现GMSMapViewDelegate。
func地图视图(地图视图:GMSMapView,didTap标记:GMSMarker)->Bool{
打印(“markerTapped”)
返回真值
}
这个函数可以工作,但我想做的是将数据从我的UIView(marker.iconView)传递到上面的func mappview中,但不完全确定如何传递。
更新
因此marker.iconView=customUIView(sport:sportEvent),每个sportEvent对象都有标题、日期和描述。customUIView看起来像一个包含信息的文本框。
在数组中有一个循环,这样地图上的每个标记都有特定的sportEvent信息。
理想情况下,我想在customUIView中添加一个手势,这样当单击“marker”时,会弹出一个包含sportEvent标题、日期和描述的详细信息的警报。但是google呈现marker.iconView的方式意味着用户输入从customUIView中丢失,所以我不能在上面设置手势。
因此,我正在寻找一个解决办法,我可以得到一个特定的标记点击,然后弹出一个提示与体育事件的信息。
所以我使用了GMSMapViewDelegate,然后当标记被单击时funcmappview激发。这很酷,但我无法获取与每个特定标记相关的sportEvent信息。
因此,我试图将sportEvent对象传递到func mappview中,但函数似乎没有执行,标记也不再可单击。
谢谢。
最佳答案
我的方法是创建一个自定义GMSMarker。这将在地图视图上创建点。
初始化自定义标记时,您希望传入sportEvent
对象(例如CustomMarker(with: sportEvent)
)GMSMarker
对象有一些您可以设置的属性,您可以找到here但是,一些值得注意的属性包括:title
,snippet
(标题下的文本),这是您要从sportEvent对象设置的内容。
因此,在自定义标记中,您可以执行以下操作:
Class CustomMarker: GMSMarker {
var title: String
var desc: String
...
init(with sportEvent: SportEvent) {
// do some validation before setting this assumes all values are set correctly
self.title = sportEvent.title //(assuming `.title` is a string)
self.desc = sportEvent.description
...
super.init()
title = self.title
snippet = self.desc
}
}
注意,自定义GMSMarker可能需要一个
position
属性集,它只是一个CLLocationCoordinate2D
即(position = CLLocationCoordinate2D(latitude: sportEvent.latitude, longitude: sportEvent.longitude)
默认情况下,这将显示一个带有sportEvent对象的迷你标记信息窗口。
如果您想进一步自定义标记信息窗口,可以查看markerInfoWindow
它返回一个视图,如果它存在。我所做的是以编程的方式创建我的视图,然后我将自定义标记传入视图,并相应地在那里设置所有内容。
就像这样:
func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
let customMarker = marker as! CustomMarker
return myCustomView(with: customMarker)
}
其中
myCustomView
是返回UIView的方法`func myCustomView(with customMarker: CustomMarker) -> UIView {
// Set view programatically here with your customMarker
}
希望有帮助!
关于swift - 在Swift 3和Google Maps for iOS中的marker.iconView上实现手势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45203605/