将 mapViewDidChangeVisibleRegion 与 CLGeocoder 一起使用到 return 国家名称
Using mapViewDidChangeVisibleRegion with CLGeocoder to return name of the country
我只想return黑圈所在国家的名字。
[1]: https://i.stack.imgur.com/Re5FK.jpg
上图中的例子
我知道可以通过 CLGeocoder 和 CLPlacemark 以及 Mapkit 和我已经尝试了很多,但总是出错,应用程序会崩溃。
我的代码
import MapKit
import SwiftUI
struct MapView: UIViewRepresentable {
@Binding var centralCoordinate: CLLocationCoordinate2D
var anotations: [MKPointAnnotation]
func makeUIView(context: Context) -> MKMapView{
let mapview = MKMapView()
mapview.delegate = context.coordinator
return mapview
}
func updateUIView(_ view: MKMapView, context: Context) {
if anotations.count != view.annotations.count {
view.removeAnnotations(view.annotations)
view.addAnnotations(anotations)
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
init(_ parent: MapView) {
self.parent = parent
}
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[1]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
}
extension MKPointAnnotation{
static var eample: MKPointAnnotation {
let annotaton = MKPointAnnotation()
annotaton.title = "London"
annotaton.subtitle = "Home TO 2012 Summer Olampics"
annotaton.coordinate = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.13)
return annotaton
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView(centralCoordinate: .constant(MKPointAnnotation.eample.coordinate), anotations: [MKPointAnnotation.eample])
}
}
我的查看代码
import MapKit
import SwiftUI
struct MapViewIntegration: View {
@State private var centercoordinate = CLLocationCoordinate2D()
@State private var locations = [MKPointAnnotation]()
var body: some View {
ZStack {
MapView(centralCoordinate: $centercoordinate,anotations: locations)
.edgesIgnoringSafeArea(.all)
Circle()
.opacity(0.3)
.frame(width: 32, height: 32)
VStack{
Spacer()
HStack{
Spacer()
Button(action: {
let newLocations = MKPointAnnotation()
newLocations.coordinate = self.centercoordinate
self.locations.append(newLocations)
}) {
Image(systemName: "plus")
}.padding()
.background(Color.white)
.font(.title)
.clipShape(Circle())
.padding(.trailing)
}
}
}
}
}
struct MapViewIntegration_Previews: PreviewProvider {
static var previews: some View {
MapViewIntegration()
}
}
请帮忙,
提前致谢
此回答由@SanzioAngeli 给出
将此代码替换为
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[1]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
这个
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[0]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
@SanzioAngeli 谢谢。
切记不要一次发送太多请求,所有请求都会失败并抛出致命错误。
我只想return黑圈所在国家的名字。 [1]: https://i.stack.imgur.com/Re5FK.jpg 上图中的例子
我知道可以通过 CLGeocoder 和 CLPlacemark 以及 Mapkit 和我已经尝试了很多,但总是出错,应用程序会崩溃。
我的代码
import MapKit
import SwiftUI
struct MapView: UIViewRepresentable {
@Binding var centralCoordinate: CLLocationCoordinate2D
var anotations: [MKPointAnnotation]
func makeUIView(context: Context) -> MKMapView{
let mapview = MKMapView()
mapview.delegate = context.coordinator
return mapview
}
func updateUIView(_ view: MKMapView, context: Context) {
if anotations.count != view.annotations.count {
view.removeAnnotations(view.annotations)
view.addAnnotations(anotations)
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
init(_ parent: MapView) {
self.parent = parent
}
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[1]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
}
extension MKPointAnnotation{
static var eample: MKPointAnnotation {
let annotaton = MKPointAnnotation()
annotaton.title = "London"
annotaton.subtitle = "Home TO 2012 Summer Olampics"
annotaton.coordinate = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.13)
return annotaton
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView(centralCoordinate: .constant(MKPointAnnotation.eample.coordinate), anotations: [MKPointAnnotation.eample])
}
}
我的查看代码
import MapKit
import SwiftUI
struct MapViewIntegration: View {
@State private var centercoordinate = CLLocationCoordinate2D()
@State private var locations = [MKPointAnnotation]()
var body: some View {
ZStack {
MapView(centralCoordinate: $centercoordinate,anotations: locations)
.edgesIgnoringSafeArea(.all)
Circle()
.opacity(0.3)
.frame(width: 32, height: 32)
VStack{
Spacer()
HStack{
Spacer()
Button(action: {
let newLocations = MKPointAnnotation()
newLocations.coordinate = self.centercoordinate
self.locations.append(newLocations)
}) {
Image(systemName: "plus")
}.padding()
.background(Color.white)
.font(.title)
.clipShape(Circle())
.padding(.trailing)
}
}
}
}
}
struct MapViewIntegration_Previews: PreviewProvider {
static var previews: some View {
MapViewIntegration()
}
}
请帮忙, 提前致谢
此回答由@SanzioAngeli 给出
将此代码替换为
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[1]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
这个
func mapViewDidChangeVisibleRegion(_ mapView: MKMapView) {
parent.centralCoordinate = mapView.centerCoordinate
let geoCoder = CLGeocoder()
let location = CLLocation(latitude: mapView.centerCoordinate.latitude, longitude: mapView.centerCoordinate.longitude)
geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
// Place details
var placeMark: CLPlacemark!
placeMark = placemarks?[0]
// Country
if let country = placeMark.country {
print(country)
}
})
}
}
@SanzioAngeli 谢谢。
切记不要一次发送太多请求,所有请求都会失败并抛出致命错误。