我发现运行一些代码以在地图视图MKMapItem.openInMaps()
中显示位置只能在50%的时间内正常工作。
实际上,它恰好在显示的MKPlacemark
之间交替显示。
例如,每经过第1次,第3次,第5次,第7次,代码运行,然后显示地点标记,但每运行第2次,第4次,第6次,第8次,地点标记不是显示。
这是100%可重复运行下面发布的代码。
这似乎是一个错误,但如果是这样,那么我很惊讶它以前没有报道也没有修复过。但鉴于失败恰恰在成功和失败之间交替,我会认为还有其他事情发生,所以我在这里发帖,看看是否有人熟悉这个问题,或者有什么是应该做的代码中缺少哪些,或者有一个解决方法:
override func viewDidAppear(_ animated: Bool) {
displayMap()
}
func displayMap()
{
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString("1 Infinite Loop, Cupertino,California") { (placemark: [CLPlacemark]?, error: Error?) -> Void in
if error == nil
{
if let placemark = placemark, placemark.count > 0
{
let location = placemark.first
let latitude = (location?.location?.coordinate.latitude)!
let longitude = (location?.location?.coordinate.longitude)!
let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
let regionDistance:CLLocationDistance = 100000
let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
let options = [
MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
]
let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
let mapItem = MKMapItem(placemark: placemark)
mapItem.name = "Apple"
mapItem.phoneNumber = "(405) 123-4567"
mapItem.openInMaps(launchOptions: options)
}
}
else
{
assert(false, "Unable to geocode")
}
}
}
这是代码运行第一,第三,第五,第七......时间的结果
这是代码运行第二,第四,第六,第八......时间的结果
请注意,在失败屏幕截图中,不仅地图标记未在地图上显示,而且向上滑动也是空的。
(目前在10.2中观察到这一点,但也在其他版本上看过它)
答案 0 :(得分:2)
是的,似乎是mapItem.openInMaps
中的一个错误,它会将行车路线打开为叠加层。
由@return0准确描述:
...我尝试了您的代码,问题在于,一旦您将位置置于中心并显示,如果您不解除它并再次启动应用程序,它将无法显示...
mapItem.openInMaps
解除行车路线覆盖(代替显示新位置)(*)这种情况的另一个奇怪之处是,一旦覆盖关闭,位置就会消失。
通过请求多个位置强制方向叠加消失。实际上,它意味着调用两次相同位置的地图:
MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)
解决方法奖金
即使用户点击锚点并请求行车方向,随后从您的应用程序调用地图到该地点或其他位置不将其挂起。换句话说,它按预期工作。
func displayMap(_ address:String, name:String, tph:String)
{
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString(address) { (placemark: [CLPlacemark]?, error: Error?) -> Void in
assert(nil == error, "Unable to geocode \(error)")
if error == nil
{
if let placemark = placemark, placemark.count > 0
{
let location = placemark.first
let latitude = (location?.location?.coordinate.latitude)!
let longitude = (location?.location?.coordinate.longitude)!
let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
let regionDistance:CLLocationDistance = 10000
let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance)
let options = [
MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center),
MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span)
]
let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
let mapItem = MKMapItem(placemark: placemark)
mapItem.name = name
mapItem.phoneNumber = tph
MKMapItem.openMaps(with: [mapItem, mapItem], launchOptions: options)
} else {
print("Something wrong with \(placemark)")
}
}
}
}
...和调用
@IBAction func doApple() {
displayMap("1 Infinite Loop, Cupertino, California", name: "Apple", tph: "(408) 996–1010")
}
@IBAction func doMicrosoft() {
displayMap("One Microsoft Way, Redmond, WA", name: "Microsoft", tph: "1-800-MICROSOFT")
}
@IBAction func doIBM() {
displayMap("1 New Orchard Road. Armonk, New York", name: "IBM", tph: "(914) 499-1900")
}
答案 1 :(得分:0)
在iOS 10.3.2上,这个问题仍然存在。但是,此解决方法使mapItem
不会消失:
MKMapItem.openMaps(with: [mapItem], launchOptions: options)