如何在 swift 中为 ios 的 google maps sdk 中的地图视图添加标记

Posted

技术标签:

【中文标题】如何在 swift 中为 ios 的 google maps sdk 中的地图视图添加标记【英文标题】:How to add marker for a map view in google maps sdk for ios in swift 【发布时间】:2015-09-26 00:54:28 【问题描述】:

尝试在谷歌地图上添加标记,但应用在addMarker()函数调用时崩溃,异常详情如下,

由于未捕获的异常“GMSThreadException”而终止应用,原因:“必须从 UI 线程进行对 Google Maps SDK for ios 的所有调用”

仅供参考 vwGogleMap 是全局的,并且在我试图绘制标记的函数中。

func addMarker() -> Void

    var vwGogleMap : GMSMapView?
    var position = CLLocationCoordinate2DMake(17.411647,78.435637)
    var marker = GMSMarker(position: position)
    marker.title = "Hello World"
    marker.map = vwGogleMap

任何帮助将不胜感激,

TIA。

【问题讨论】:

通常情况下,这意味着您将代码放在后台线程而不是 UI 线程中。请您提供更多代码吗?所以,我可以看到你把这段代码放在你的文件中的什么地方。 在视图控制器的顶层 ViewController: UIViewController var Gmap : GMSMapView?覆盖 func viewDidLoad() super.viewDidLoad() self. addMarker() func addMarker var position = CLLocationCoordinate2DMake(17.411647, 78.435637) var marker : GMSMarker = GMSMarker(position: position) as GMSMarker marker.title = "Hello World" marker.map = Gmap 【参考方案1】:
/// Marker - Google Place marker
let marker: GMSMarker = GMSMarker() // Allocating Marker

 marker.title = "Title" // Setting title
 marker.snippet = "Sub title" // Setting sub title
 marker.icon = UIImage(named: "") // Marker icon
 marker.appearAnimation = .pop // Appearing animation. default
 marker.position = location.coordinate // CLLocationCoordinate2D

DispatchQueue.main.async  // Setting marker on mapview in main thread.
   marker.map = mapView // Setting marker on Mapview

【讨论】:

【参考方案2】:
    @IBOutlet weak var mapView: GMSMapView!
override func viewDidLoad() 
        super.viewDidLoad()

        mapView.camera = GMSCameraPosition.camera(withLatitude: 18.514043, longitude: 57.377796, zoom: 6.0)
        let marker = GMSMarker(position: CLLocationCoordinate2D(latitude: 18.514043, longitude: 57.377796))
        marker.title = "Lokaci Pvt. Ltd."
        marker.snippet = "Sec 132 Noida India"
        marker.map = mapView
    

【讨论】:

【参考方案3】:

在闭包中执行 UI 更新(在我的例子中 - 绘图标记)时,请记住仅在主线程上获取主线程并执行 UI 操作

我所做的错误是,我正在尝试在 Web 服务完成块中绘制标记。

dispatch_async(dispatch_get_main_queue(),

    var position = CLLocationCoordinate2DMake(17.411647,78.435637)
    var marker = GMSMarker(position: position)
    marker.title = "Hello World"
    marker.map = vwGogleMap
)

// For swift 3.0 support.
// 1. Get Main thread
DispatchQueue.main.async

    // 2. Perform UI Operations.
    var position = CLLocationCoordinate2DMake(17.411647,78.435637)
    var marker = GMSMarker(position: position)
    marker.title = "Hello World"
    marker.map = vwGoogleMap

希望这对某人有所帮助!

【讨论】:

谢谢哥们!你节省了我的时间。 感谢您的代码。当我尝试在闭合中绘制折线时,它可以帮助我解决问题应用程序崩溃。 @naresh reddy 。你能告诉我如何更新谷歌地图中的标记位置吗? @Madhavi marker.position = CLLocationCoordinate2DMake(17.411647,78.435637) 希望这会有所帮助。【参考方案4】:
var marker = GMSMarker()
marker.location = location
marker.title = location.name
marker.snippet = "Info window text"
marker.map = mapView

location 属性必须设置为 CLLocationCoordinate2D

要创建一个新的位置坐标,请使用:

 CLLocationCoordinate2D(latitude: CLLocationDegrees(<latitude>), longitude: CLLocationDegrees(<longitude>))

其实很简单.. 确保您的地图已通过这样做进行初始化

【讨论】:

以上是关于如何在 swift 中为 ios 的 google maps sdk 中的地图视图添加标记的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中为 Swift 3/4 移除 UIPageViewController 弹跳效果

如何在 Swift 中为 iOS 创建 SDK?

如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类

如何在 UIPickerview iOS swift 中为组件赋予标题

在 iOS Swift 中,在 Swift 4 中的 TableView 中为 CollectionView 集成不同的数组

如何使用swift在iOS中为活动设置两种不同大小的背景图像作为横向和纵向模式