特别是使用Swift旋转AnnotationView坐标

时间:2016-06-10 08:03:34

标签: ios swift annotations mkmapview

我创建了苹果地图应用程序并使用MKCircle和MKPolyline处理位置映射。

我用过

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? 
{}

以上地图视图中自定义注释更新的方法。

当注释到达特定时间点时,我可以旋转图像。

我要求将注释移动三个位置从洛杉矶和纽约开始,最后是墨西哥城,所以当注释到达纽约时我想要旋转注释图像。有可能请给我一些说明。

有关详细信息,请参阅以下编码部分。

    //
    //  ViewController.swift
    //  RouteMap
    //
    //  Created by Suthan M.
    //  Copyright © 2016 suthan.nimalan.m All rights reserved.
    //

    import UIKit
    import MapKit

    extension Double {
    /** Converts the specified value in degrees into radians. */

    func degrees() -> CGFloat {
        return CGFloat(self) * CGFloat(M_PI / 180.0)
    }
}

class ViewController: UIViewController,MKMapViewDelegate {

    @IBOutlet var mkMapView: MKMapView!

    var flightpathPolyline: MKGeodesicPolyline!
    var planeAnnotation: MKPointAnnotation!
    var planeAnnotationPosition = 0
    var planeDirection: CLLocationDirection!
    var testValue: MKMapPoint!
    var testCount: Int!
    var radiusInSomething : CLLocationDistance = 10000000.0
    var circle:MKCircle!

    override func viewDidAppear(animated: Bool) {

        let location = CLLocationCoordinate2D(
            latitude: 33.9424955,
            longitude: -118.4080684
        )

        self.mkMapView.setRegion(MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 95, longitudeDelta: 95)), animated: true)

        let LAX = CLLocation(latitude: 33.9424955, longitude: -118.4080684)
        let JFK = CLLocation(latitude: 40.6397511, longitude: -73.7789256)
        let WAS = CLLocation(latitude: 19.432608, longitude: -99.133209)
        let mexicoCityLoc = CLLocationCoordinate2D(latitude: 19.4284700, longitude: -99.1276600)

        mkMapView.addOverlay(MKCircle(centerCoordinate: mexicoCityLoc,
            radius: radiusInSomething * MKMetersPerMapPointAtLatitude(mexicoCityLoc.latitude)))

        var coordinates = [LAX.coordinate, JFK.coordinate, WAS.coordinate]
        flightpathPolyline = MKGeodesicPolyline(coordinates: &coordinates, count: 3)

        mkMapView.addOverlay(flightpathPolyline)

        let coordin = CLLocationCoordinate2D(latitude: 19.4284700, longitude: -99.1276600)
        circle = MKCircle(centerCoordinate: coordin, radius: 2000)
        mkMapView.addOverlay(circle)

        let annotation = MKPointAnnotation()
        annotation.title = NSLocalizedString("Plane", comment: "Plane marker")
        mkMapView.addAnnotation(annotation)

        self.planeAnnotation = annotation
        self.updatePlanePosition()

    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Work with MKMapview

        self.planeDirection = 360.0
        testCount = 0

        mkMapView.delegate = self
        mkMapView.mapType = MKMapType.Standard
        mkMapView.showsUserLocation = true

    }


    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {


        if overlay is MKPolyline {

            let renderer = MKPolylineRenderer(overlay: overlay)
            renderer.lineWidth = 3.0
            renderer.alpha = 0.5
            renderer.strokeColor = UIColor.blueColor()

            return renderer

        }else if overlay is MKCircle {

            let circleRenderer = MKCircleRenderer(overlay: overlay)
            circleRenderer.fillColor = UIColor.blueColor().colorWithAlphaComponent(0.1)
            circleRenderer.strokeColor = UIColor.blueColor()
            circleRenderer.lineWidth = 1

            return circleRenderer

        }

        return MKOverlayRenderer()
    }

    func updatePlanePosition() {

        let step = 5
        guard planeAnnotationPosition + step < flightpathPolyline.pointCount
            else { return }

        let points = flightpathPolyline.points()
        self.planeAnnotationPosition += step
        let nextMapPoint = points[planeAnnotationPosition]

        self.planeAnnotation.coordinate = MKCoordinateForMapPoint(nextMapPoint)

        let previousMapPoint = points[planeAnnotationPosition]
        planeAnnotationPosition += step

        self.planeDirection = directionBetweenPoints(previousMapPoint, nextMapPoint)

        // set turn point of plane

        if(testValue.x == 79197107.0566392){

            testCount = 1
            planeDirection = 360.0

            self .mapView(mkMapView, viewForAnnotation: planeAnnotation )
        }

        performSelector("updatePlanePosition", withObject: nil, afterDelay: 0.03)

    }

    private func directionBetweenPoints(sourcePoint: MKMapPoint, _ destinationPoint: MKMapPoint) -> CLLocationDirection {

        //print(sourcePoint)

        //MKMapPoint(x: 74074213.8054451, y: 105154930.159039)
        //MKMapPoint(x: 74074213.8054451, y: 105154930.159039)

        testValue = sourcePoint

        let x = destinationPoint.x - sourcePoint.x
        let y = destinationPoint.y - sourcePoint.y

        return radiansToDegrees(atan2(y, x)) % 360 + 90
    }

    private func radiansToDegrees(radians: Double) -> Double {
        return radians * 180 / M_PI
    }

    private func degreesToRadians(degrees: Double) -> Double {
        return degrees * M_PI / 180
    }

    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

        let planeIdentifier = "Plane"

        let annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(planeIdentifier)
            ?? MKAnnotationView(annotation: annotation, reuseIdentifier: planeIdentifier)

        annotationView.image = UIImage(named: "pointer")

        if(testCount == 1){

            let angle = CGFloat(self.degreesToRadians(self.planeDirection))
            annotationView.transform = CGAffineTransformRotate(mapView.transform, angle)

        }
        else{

            let angle = CGFloat(degreesToRadians(planeDirection))
            annotationView.transform = CGAffineTransformRotate(mapView.transform, angle)

        }

        return annotationView

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

Current Snap

感谢。

1 个答案:

答案 0 :(得分:1)

在我的情况下,我得到了目的地的标题(角度)。所以我在我的项目中做的就像漫游图像而不是注释视图。

// viewForAnnotation方法

public StreamingResponseBody stream(HttpServletRequest req)
        throws FileNotFoundException {
    File file = new File(req.getRealPath("/")+"js/loginPage/usermanual.pdf");
    InputStream is = new FileInputStream(file);
    return (os) -> {
        IOUtils.copy(is, os);
    };
}

我添加了一个扩展程序。https://ruigomes.me/blog/how-to-rotate-an-uiimage-using-swift/

 annotationView.image = UIImage(named: "pointer")?.imageRotatedByDegrees(CGFloat(angle), flip: false)