通过分段控制更改地图类型(混合、卫星)

问题描述 投票:0回答:3

我正在尝试使用分段控制按钮更改地图类型,我希望它可以通过 3 个选项更改地图类型:标准、卫星和混合。到目前为止,我有这段代码,但一旦选择了不同的地图类型,什么也没有发生:

@IBAction func segmentedControlAction(sender: UISegmentedControl!) {

    if sender.selectedSegmentIndex == 0{

        mapView.mapType = MKMapType.Standard
    }
    else if sender.selectedSegmentIndex == 1{

        mapView.mapType = MKMapType.Satellite
    }
    else if sender.selectedSegmentIndex == 3{

        mapView.mapType = MKMapType.Hybrid
    }
}

我是 Swift 和 Xcode 的新手,因此感谢任何帮助:)

谢谢

swift mkmapview hybrid
3个回答
24
投票

首先,确保当分段控件选择更改时正在调用您的方法。很容易忘记连接插座方法。验证后,请记住地图数据是异步加载的,因此在选择不同模式后您可能不会立即看到它发生变化。但是,使用您发布的代码,您将never看到

.Hybrid
类型,因为3段控件中的
selectedSegmentIndex
never为3。

该方法更简洁的实现方式是:

@IBAction func segmentedControlAction(sender: UISegmentedControl!) {
    switch (sender.selectedSegmentIndex) {
        case 0:
            mapView.mapType = .Standard
        case 1:
            mapView.mapType = .Satellite
        default:
            mapView.mapType = .Hybrid
    }
}

请注意,Swift 不需要在每个

break
末尾添加
case
语句。

编辑:Swift 4.1

@IBAction func mapTypeSegmentSelected(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            mapView.mapType = .standard
        case 1:
            mapView.mapType = .satellite
        default:
            mapView.mapType = .hybrid
        }
    }

1
投票
import CoreLocation
import MapKit

class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate {

    @IBOutlet weak var my_map: MKMapView!

    var my_location = CLLocationManager()

    enum maptype:NSInteger
    {
        case standardmap = 0
        case satellitemap = 1
        case hybridmap = 2
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.
        self.my_map.showsUserLocation = true
        self.my_map.delegate = self    
        self.my_location = CLLocationManager.init()
        self.my_location.delegate = self
        self.my_location.requestWhenInUseAuthorization()
        self.my_location.stopUpdatingLocation()            

        let location = CLLocationCoordinate2DMake(11.004556, 76.961632)
        let span = MKCoordinateSpanMake(0.1, 0.1)
        let region = MKCoordinateRegionMake(location, span)

        my_map.setRegion(region, animated: true)

        let annotation = MKPointAnnotation()

        annotation.coordinate = location
        annotation.title = "coimbatore"
        annotation.subtitle = "manchester city"

        my_map.addAnnotation(annotation)    
    }

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
    {    
        /*let annotationview = MKAnnotationView(annotation: annotation, reuseIdentifier: "pin")

        annotationview.image = UIImage(named:"nature.jpeg")

        //let transform = CGAffineTransform(scaleX: 0.1, y: 0.1)
        //annotationview.transform = transform

        return annotationview*/

        let annotationReuseId = "Place"

        var anView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationReuseId)

        if anView == nil {
            anView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationReuseId)
        } else {
            anView?.annotation = annotation
        }

        anView?.image = UIImage(named: "annotation")

        let transform = CGAffineTransform(scaleX: 0.1, y: 0.1)

        anView?.transform = transform
        anView?.backgroundColor = UIColor.clear
        anView?.canShowCallout = false

        return anView
    }

    @IBAction func maptypes(_ sender: Any)
    {
        switch(sender as AnyObject).selectedSegmentIndex
        {
        case maptype.standardmap.rawValue:
            my_map.mapType = .standard
        case maptype.satellitemap.rawValue:
            my_map.mapType = .satellite
        case maptype.hybridmap.rawValue:
            my_map.mapType = .hybrid
        default:
            break
        }
    }

0
投票

更新 Swift 5.9: mapType 已弃用。现在使用首选配置。

这是使用 UIAlertController 的示例:

//向导航栏添加按钮

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Change Map Type", style: .plain, target: self, action: #selector(mapTypeTapped))

//设置AlertController

@objc func mapTypeTapped(){
    let ac = UIAlertController(title: "Choose map type:", message: nil, preferredStyle: .actionSheet)
    
    ac.addAction(UIAlertAction(title: "Hybrid", style: .default, handler: setMapType))
    ac.addAction(UIAlertAction(title: "Satellite", style: .default, handler: setMapType))
    ac.addAction(UIAlertAction(title: "Standard", style: .default, handler: setMapType))
    ac.addAction(UIAlertAction(title: "Cancel", style: .cancel))

    present(ac, animated: true)
    
}

//切换action.title

func setMapType(_ action: UIAlertAction){
    
    switch action.title {
    case "Hybrid":
        if #available(iOS 16.0, *) {
            mapView.preferredConfiguration = MKHybridMapConfiguration(elevationStyle: .realistic)
        } else {
            mapView.mapType = .hybrid
        }
    case "Satellite":
        if #available(iOS 16.0, *) {
            mapView.preferredConfiguration = MKImageryMapConfiguration(elevationStyle: .realistic)
        } else {
            mapView.mapType = .satellite
        }
    default:
        if #available(iOS 16.0, *) {
            mapView.preferredConfiguration = MKStandardMapConfiguration(elevationStyle: .realistic)
        } else {
            mapView.mapType = .standard
        }
    }
    
}
© www.soinside.com 2019 - 2024. All rights reserved.