在 Swift 4 中自动调整缩放以适应 iOS 中的所有标记

Posted

技术标签:

【中文标题】在 Swift 4 中自动调整缩放以适应 iOS 中的所有标记【英文标题】:Automatically adjust zoom to accommodate all markers in iOS in Swift 4 【发布时间】:2018-10-23 21:24:10 【问题描述】:

我有一个 namelonlat 的字典。

原始数据

var places = [["name": "Angkor Wat", "lon": "103.8670", "lat": "13.4125"], ["name": "Pick up zone", "lon": "103.85771740610468", "lat": "13.41250067905404"], ["name": "66-35 Otto Rd", "lon": "-73.8889131530723", "lat": "40.706725952864886"], ["name": "40 Williams St", "lon": "-71.30756271909428", "lat": "42.64240728775266"], ["name": "324 Broadway Rd", "lon": "-71.29124543680823", "lat": "42.68061286243683"], ["name": "39 Kendall Pond Rd", "lon": "-71.33234704167283", "lat": "42.867489706954636"], ["name": "269 Treble Cove Rd", "lon": "-71.30049088921143", "lat": "42.55656906569715"]]

列表

代码

这是我现在拥有的代码。

import UIKit
import MapKit
import CoreLocation

class ViewAllPinsController: UIViewController, MKMapViewDelegate 

    @IBOutlet weak var map: MKMapView!

    var places = [ Dictionary<String,String>()]

    override func viewDidLoad() 
        super.viewDidLoad()

        print(places) // it print fine

        if places.count > 0 

            for i in 0..<places.count 
                if let name = places[i]["name"] 
                    if let lat = places[i]["lat"] 
                        if let lon =  places[i]["lon"] 
                            if let latitude = Double(lat) 
                                if let longitude = Double(lon) 

                                    //Debug
                                    //print(i)
                                    //print(name)
                                    //print(latitude)
                                    //print(longitude)


                                    let span = MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
                                    let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
                                    let region = MKCoordinateRegion(center: coordinate, span: span)

                                    self.map.setRegion(region, animated: true)

                                    let annotation = MKPointAnnotation()
                                    annotation.coordinate = coordinate
                                    annotation.title = name
                                    self.map.addAnnotation(annotation)



                                
                            
                        
                    
                
            
        
    



结果


目标

我希望它们自动适应屏幕内的所有标记。

在阅读了一个又一个帖子之后,我没有看到太多关于 Swift4 的指导。像这样的事情怎么办?

【问题讨论】:

MKMapView 有一个 showAnnotations 函数,该函数接受一组注释并将设置区域以使所有注释都可见。 【参考方案1】:

你可以试试

self.map.showAnnotations(self.map.annotations, animated: true)

或者如果你想自定义区域的跨度

func zoomToFitMapAnnotations(map:MKMapView)

    if(map.annotations.count == 0)
    
          return
    

    var topLeftCoord = CLLocationCoordinate2D(latitude: -90, longitude: 180) 

    var bottomRightCoord = CLLocationCoordinate2D(latitude: 90, longitude: -180)


    map.annotations.forEach  

        topLeftCoord.longitude = fmin(topLeftCoord.longitude, $0.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, $0.coordinate.latitude);

        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, $0.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, $0.coordinate.latitude);
     

    let resd = CLLocationCoordinate2D(latitude: topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5, longitude: topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5)

    let span = MKCoordinateSpan(latitudeDelta: fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.3, longitudeDelta: fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.3)

    var region = MKCoordinateRegion(center: resd, span: span);

    region = map.regionThatFits(region)

    map.setRegion(region, animated: true)



【讨论】:

第一个选项显示所有标记,但区域可能最低,这样您可能会在屏幕/地图的边缘看到 ann 注释,, func 选项提供了一个可以增加的跨度以使相机缩小更多 首先取消注释 setRegion 行,然后在 viewDidLoad 末尾使用 opt1/opt2,其中地图实际上包含不在您添加它们的 for 循环内的注释 同样对于 op2 复制所有的 func 并调用它不要使用它的某些部分 从 viewDidLoad 中取出函数(在类中也是一个常用函数),并像这样调用它 zoomToFitMapAnnotations(map:map) 嘿,您的第一个建议非常有效。结果:i.imgur.com/mB0isox.jpg

以上是关于在 Swift 4 中自动调整缩放以适应 iOS 中的所有标记的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用程序上设置自动缩放(针对 iPhone 6 的 4.7 英寸屏幕进行了优化)以适应 iPhone 5 和 4 的屏幕?

Swift 3 - 调整字体大小以适应宽度,多行

自动缩放 TextView 文本以适应 4.0 中的范围

使用 AutoLayout 缩放 UIImageView 以适应宽度

自动调整 TableViewCell 的高度以适应 iOS 6 中的 UIImageVIew

无法让 UIImageView 调整大小以适应屏幕