Swift MKAnnotationView 旋转

3

我正在尝试在更改坐标时旋转我的自定义注释。我可以成功更改坐标,但尝试了一切都无法旋转它。基本思路是拥有一个平面并用旋转设置其方向。

以下是我的代码:

import UIKit
import MapKit

class CustomPointAnnotation: MKPointAnnotation {
    var imageName: String!
}

class ViewController: UIViewController, MKMapViewDelegate {

var myAnnot : MKPointAnnotation!
var myDegree = 0.0
var mylat = 41.1036

@IBOutlet weak var mapView: MKMapView!
override func viewDidLoad() {
    super.viewDidLoad()


    mapView.delegate = self
    mapView.mapType = MKMapType.Hybrid
    mapView.showsUserLocation = true
    // Do any additional setup after loading the view, typically from a nib.
}

override func viewDidAppear(animated: Bool) {

    println("HOMESET")
    var homeGPSData = CLLocation(latitude: 41.1036, longitude: 29.3822)
    println(homeGPSData)
    self.myAnnot = MKPointAnnotation()

    myAnnot.coordinate = CLLocationCoordinate2DMake(homeGPSData.coordinate.latitude, homeGPSData.coordinate.longitude)
    myAnnot.title = "Base"
    var rangeCircle : MKCircle  = MKCircle(centerCoordinate: homeGPSData.coordinate, radius: 20000)
    mapView.addOverlay(rangeCircle)
    mapView.addAnnotation(myAnnot)

   var myLoop = NSTimer.scheduledTimerWithTimeInterval(0.0004, target: self, selector: "rotateAndMoveAnnotation", userInfo: nil, repeats: true)


}


func rotateAndMoveAnnotation() {


    var lon = 29.3822

    var homeGPSData = CLLocation(latitude: self.mylat, longitude: lon)

    myAnnot.coordinate = CLLocationCoordinate2DMake(homeGPSData.coordinate.latitude, homeGPSData.coordinate.longitude)

    self.mylat = self.mylat + 0.001
    self.myDegree = self.myDegree + 1




}

func degreesToRadians(degrees: Double) -> Double { return degrees * M_PI / 180.0 }
func radiansToDegrees(radians: Double) -> Double { return radians * 180.0 / M_PI }

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



    let reuseId = "test"

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil {
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)

    }

    anView.image = UIImage(named: "sprite.png")


    return anView
}

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


}
3个回答

1

这是我的做法(是的,我用了你的示例代码的一部分 :) 主要是获取注释视图并更改(旋转)图像:

for tempAnnotation in self.mapView.annotations as! [RouteAnnotation]
{
    tempAnnotation.angle = annotations[self.annotationIDs[tempAnnotation.routeId]!].angle
    let annotationView: MKAnnotationView = self.mapView.viewForAnnotation(tempAnnotation)!
    var annotationViewImage = annotationView.image
    annotationViewImage = imageResize(image: UIImage(named:"arrowPin.png")!,sizeChange: CGSizeMake(48, 48)).imageRotatedByangles(CGFloat(tempAnnotation.angle), flip: false)
    annotationView.image = annotationViewImage
}

// 路由注解类

class RouteAnnotation : MKPointAnnotation {
    var angle: Int = 0
    var routeId: Int = 0
}

//UIImage扩展

extension UIImage {
public func imageRotatedByangles(angles: CGFloat, flip: Bool) -> UIImage {
    let anglesToRadians: (CGFloat) -> CGFloat = {
        return $0 / 180.0 * CGFloat(M_PI)
    }

    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRect(origin: CGPointZero, size: size))
    let t = CGAffineTransformMakeRotation(anglesToRadians(angles));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()

    // Move the origin to the middle of the image so we will rotate and scale around the center.
    CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0, rotatedSize.height / 2.0);

    //   // Rotate the image context
    CGContextRotateCTM(bitmap, anglesToRadians(angles));

    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat

    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }

    CGContextScaleCTM(bitmap, yFlip, -1.0)
    CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}
}

希望这能帮助到有同样问题的人


1

我添加了下面的两行代码,旋转在swift 4中可以完美工作:

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

    let reuseIdentifier = "pin"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier)

    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)
        annotationView?.canShowCallout = true
    } else {

        annotationView?.annotation = annotation
    }

    //these two lines rotated the annotation ---------->>
    var rotationInRadian: Double = .pi
    annotationView?.transform = CGAffineTransform(rotationAngle: rotationInRadian)

    return annotationView
}

刚刚注意到rotationAngle是以弧度为单位的CGFloat数字。


不错,但有一个注意事项:弹出窗口也会旋转 :) - MartijndeM

0
发现了一个不太优雅的解决方案...只需在viewforAnnotation方法中添加以下行:
anView.boundsRotation = myRotateAngle

1
没有这样的属性。您能详细说明一下吗? - OhadM
它在AppKit(macOS)中可用。 - Billy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接