Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift MK注释视图旋转_Swift - Fatal编程技术网

Swift MK注释视图旋转

Swift MK注释视图旋转,swift,Swift,我试图在坐标更改时旋转自定义注释。 我可以成功地更改坐标,但尝试了所有方法来旋转它,但没有成功。基本思想是创建一个平面并使用“旋转”设置其方向 这是我的密码: import UIKit import MapKit class CustomPointAnnotation: MKPointAnnotation { var imageName: String! } class ViewController: UIViewController, MKMapViewDelegate { va

我试图在坐标更改时旋转自定义注释。 我可以成功地更改坐标,但尝试了所有方法来旋转它,但没有成功。基本思想是创建一个平面并使用“旋转”设置其方向

这是我的密码:

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


}
找到了一个肮脏的解决方案。。 刚刚在viewforAnnotation方法中添加了以下行:

anView.boundsRotation = myRotateAngle

它以这种方式为我工作(是的,我使用了您示例中的一些代码部分:) 主要是获取注释视图并更改(旋转)图像,然后:

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

希望,它能帮助有同样问题的人

我在下面添加了两行代码,并在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
数字。

不错,但有一点需要注意:弹出窗口也会旋转:)没有类似的属性。您能详细说明一下吗?它在AppKit(macOS)中提供