旋转注释自定义图像

Rotate Annotation Custom Image

我显然不明白。我正在尝试找出如何旋转地图注释的自定义图像。即多个图标指向不同的方向。我已经遍历了一大堆飞机数据,我想简单地显示飞机的前进方向。

查看我拼凑起来的代码,至少有一半可以正常工作,并提供有关如何根据变量转换图像的建议性想法。

循环数据的抽象视图

             NSMutableArray *locations = [[NSMutableArray alloc]init];
             CLLocationCoordinate2D location;

             MKPointAnnotation *myAnn;
             myAnn = [[MKPointAnnotation alloc]init];
             location.latitude = nLatitudeFloat;
             location.longitude = nLongitudeFloat;
             myAnn.coordinate = location;
             myAnn.title = nRealname;

             //Add the Annotation object to the list so when the map is presented all points are listed on the map.
             [locations addObject:myAnn];

             //[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
             [self.mapView addAnnotations:locations];

注释更新:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // If it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]]) return nil;

    // Handle any custom annotations.
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        // Try to dequeue an existing pin view first.
        MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];

        if (!pinView)
        {
            // If an existing pin view was not available, create one.
            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
            pinView.canShowCallout = YES;

            pinView.image = [UIImage imageNamed:@"airplane21.png"] ;
            pinView.calloutOffset = CGPointMake(0, 32);
            pinView.transform = CGAffineTransformMakeRotation(30);    <------AT THE MOMENT I HAVE JUST HARD CODED THIS TO SEE IF IT WORKS. IT ROTATES THE ENTIRE ANNOTATION

            // Add a detail disclosure button to the callout.
            //UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            //pinView.rightCalloutAccessoryView = rightButton;

            // Add an image to the left callout.
            UIImageView *iconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"airplane21.png"]];
            pinView.leftCalloutAccessoryView = iconView;
            iconView.transform = CGAffineTransformMakeRotation(30);  
        } else {
            pinView.annotation = annotation;
        }
        return pinView;
    }
    return nil;
}

有什么想法吗?

这个我顺便看过了。我只是不确定它是否合适。 Rotate annotation image on MKMapView

我遇到了同样的问题,我有一个似乎有效的解决方案。

您需要先创建一个自定义注释来保存您想要的数据(例如坐标、您的飞机航向)。当您遍历数据时,请确保您使用的是自定义注释。例如

CustomAnnotation* annotation = [[CustomAnnotation alloc] init];
annotation.coordinates = ...
annotation.bearing = ...

然后在您的 viewForAnnotation 方法中,您可以通过执行类似

的操作来获取该信息
if ([annotation isKindOfClass:[CustomAnnotation class]]) {
    CustomAnnotation* myAnn = (CustomAnnotation*)annotation;
    double bearing = myAnn.bearing; // or whatever it's called

    ...
}

希望对您有所帮助。

编辑:为了旋转您的图像,我在某处找到了以下代码片段。它有效,但会使您的图像像素化一点。

@interface UIImage (RotationMethods)
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;
@end

@implementation UIImage (RotationMethods)

static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees
{
    // calculate the size of the rotated view's containing box for our drawing space
    UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    // Create the bitmap context
    //UIGraphicsBeginImageContext(rotatedSize); // For iOS < 4.0
    UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, 0.0);
    CGContextRef 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, rotatedSize.height/2);

    // Rotate the image context
    CGContextRotateCTM(bitmap, DegreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    CGContextScaleCTM(bitmap, 1.0, -1.0);
    CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

@end

将其粘贴到您的 .m 中,并且您现在可以在任何 UIImage 上执行 [someUIImage imageRotatedByDegrees:yourDegrees];

所以现在在你的 viewForAnnotation 方法中你可以做类似

UIImage* image = [[UIImage imageNamed:@"yourImage.png"] imageRotatedByDegrees:degrees];
annView.image = image;