【问题标题】:Swift MKMapView.setRegion not working after MKLocalSearch.RequestSwift MKMapView.setRegion 在 MKLocalSearch.Request 之后不起作用
【发布时间】:2019-12-22 20:25:10
【问题描述】:

我一直在开发一个应用程序来注释 MKMapView 与用户附近的所有夜生活位置。我已经实现了一个由 SwiftUI 按钮调用的中心函数。基于 CLLocationManager.location 的居中器工作正常,但在任何 MKLocalSearch 查询之后,setRegion 停止工作。它必须是 setRegion,因为仍然会打印正确的纬度/经度。我也知道这不是由于注释,因为注释添加/删除部分被注释掉时会发生相同的错误。它可能与链接 searchRequest.region 和 map.region 有关吗? manager 是 CLLocationManager 实例,map 是 MapView

func recenter(){
        print("Recenter called")
        guard let center = manager.location?.coordinate else{
            print("Could not get location for recenter")
            return
        }
        let newRegion = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
        print("\(center.latitude) and \(center.longitude)")
        map.setRegion(newRegion, animated: true)
    }
func queryAndAnnotate(){
        let searchRequest = MKLocalSearch.Request()
        searchRequest.naturalLanguageQuery = "nightlife"
        searchRequest.region = map.region
        let search = MKLocalSearch(request: searchRequest)
        search.start{response, error in
            guard let response = response else {
                Alert(title:Text("Alert"), message: Text("Error: \(error?.localizedDescription  ?? "Unknown Error")"))
                return
            }
            var mapItemPlacemarks: [MKPointAnnotation] = []
            self.barsList = []
            for i in response.mapItems{
                let x = MKPointAnnotation()
                x.coordinate = i.placemark.coordinate
                x.title = i.name
                mapItemPlacemarks.append(x)
            }
            self.map.removeAnnotations(mapItemPlacemarks)
            self.map.addAnnotations(mapItemPlacemarks)
        }

    }

【问题讨论】:

    标签: ios swift mapkit swiftui


    【解决方案1】:

    MKLocalSearch.start在后台任务中调用completionHandler。

    在此处理程序中,您正在后台任务中更新您的 mapView 实例。

    确保在主任务中调用mapView的所有更新方法(removeAnnotationsaddAnnotationssetRegion

    顺便说一句

    self.map.removeAnnotations(mapItemPlacemarks)
    self.map.addAnnotations(mapItemPlacemarks)
    

    您正在删除 mapView 中不存在的 mapItemPlacemark。这没有任何意义,但这不是你的问题。

    【讨论】:

    • 尝试但结果没有变化。事实证明,问题实际上是通过将找到的位置添加到以 ScrollView 表示的数组中的,该数组显示在上滑抽屉中的地图上。我怀疑地图视图认为它不再可见,因此会自行重置。我会用这个新信息重新问这个问题
    • 好的。尽管如此,在主任务中进行更新,它将防止其他问题。
    【解决方案2】:

    事实证明,问题来自对 ScrollView 的动态更新。 ScrollView 位于 Z 轴上 MapView 上方的向上滑动抽屉中。当使用本地搜索的结果更新 ScrollView 时,MapView 对象丢失了对 userLocation 的跟踪(读取 0,0),并且无法以编程方式更改该区域。我最终解决了这个问题,完全放弃了 centerer() 函数,而是在它自己的 UIViewRepresentable 中实现了一个 MKUserTrackingButton(对于 SwiftUI)。 MKUserTrackingButton 是系统通过用户跟踪模式映射循环的方式。您可以在此处阅读相关文档:https://developer.apple.com/documentation/mapkit/mkusertrackingbutton

    【讨论】:

    • 您能否发布一个示例,说明您如何通过 SwiftUI 启用 MKUserTrackingButtonMKMapView 的交互?
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 2013-12-28
    • 2013-11-07
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    相关资源
    最近更新 更多