2015-06-21 3 views
0

Я пытаюсь повернуть свою пользовательскую аннотацию при изменении координат. Я могу успешно изменить координату, но попробовал все, чтобы вращать ее без везения. Основная идея состоит в том, чтобы иметь плоскость и задавать ее направление вращением.Swift MKAnnotationView Rotate

Вот мой код:

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. 
} 


} 

ответ

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 
} 
} 

Надежда, это поможет кому-то, кто имеет те же проблемы,

0

Найден грязный раствор .. просто добавили следующую строку в метод viewforAnnotation:

anView.boundsRotation = myRotateAngle