0

我目前正在使用 CGAffineTransformMakeRotation 旋转 MKAnnotationView 的图像属性。但是,在这种情况下,整个视图以及标注气泡都会旋转。所以我遵循了MKAnnotationView Only Rotate the Image property中的建议,现在正在创建一个 UIImageView 并将其作为子视图添加到 MKAnnotationView。图像现在可以毫无问题地显示和旋转。但是,现在 MKAnnotationView 不响应触摸事件。我需要它像以前一样表现 - 在点击/触摸时它应该显示标注气泡。有什么想法我需要做什么吗?

我尝试的初始方式(旋转标注气泡):

MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
aView.image = [UIImage imageNamed:@"mapPin.png"];
float newRad = degreesToRadians(degreesToRotate);
[aView setTransform:CGAffineTransformRotate(CGAffineTransformIdentity, newRad)];

使用 UIImageView 并添加为子视图:

MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"mapPin.png"]];
iv.userInteractionEnabled = YES;
[aView addSubview:iv];
aView.canShowCallout = YES;

更新 我尝试添加手势识别器,但它不起作用。当我点击地图上 MKAnnotationView 中的 UIImageView 时,不会调用 imageTapped 方法。这是在方法内: - (MKAnnotationView *)mapView:(MKMapView *)mView viewForAnnotation:(id )annotation

MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];

UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"mapPin.png"]];
iv.userInteractionEnabled = YES;
iv.exclusiveTouch = NO;

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
[iv addGestureRecognizer:tapGesture];

[aView addSubview:iv];
4

5 回答 5

2

我在这里尝试了所有答案,但没有一个完全奏效,但我找到了一个不同的解决方案!

我相信最简单的方法是UIImage在设置image. MKAnnotationView如果你有成百上千的注释,这可能会表现不佳,但如果你只需要旋转几个东西(比如我的例子),它就可以了。

我找到了一个帮助类来旋转 UIImages,然后在设置image属性之前简单地使用它来旋转 UIImage MKAnnotationView

助手类在这里:http ://www.catamount.com/forums/viewtopic.php?f=21&t=967

现在,要在地图上旋转 MKAnnotationView 的 UIImage 属性而不牺牲标注气泡,请执行以下操作:

- (MKAnnotationView *)mapView:(MKMapView *)pMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MyAnnotationView *annotationView = [[MyAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"WayPoint"]; 

    annotationView.image = [annotationView.image imageRotatedByDegrees:45.0];

    annotationView.canShowCallout = YES;

    return annotationView;
}
于 2013-08-04T19:56:39.577 回答
2

我意识到这是一个非常古老的问题,但我最近遇到了这个问题,它有一个非常简单的解决方案。使用图像视图时注释视图变得不可点击的唯一原因是 MKAnnotationView 在未设置图像时具有 (0,0) 的大小。图像视图是可见的,因为注释视图没有裁剪到边界。我所要做的就是在注释视图上设置框架以使其再次可点击。

MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation  reuseIdentifier:@"Pin"];
UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"mapPin.png"]];
[aView addSubview:iv];
annotationView.frame = (CGRect) {
            .origin = CGPointZero,
            .size = iv.frame.size
        };
aView.canShowCallout = YES;
于 2014-06-16T20:29:39.603 回答
0

尝试对图像视图执行类似的操作,看看是否可以将其触摸事件传递给注释。

//Do this before you add the imageview as a subview
self.imageView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped:)];
[self.imageView addGestureRecognizer:tapGesture];



- (void) imageTapped:(UITapGestureRecognizer *)tapGesture {
    MKAnnotationView * annotationView =  (MKAnnotationView *)tapGesture.view.superview;
    if (annotationView.selected) {
        [annotationView setSelected:NO animated:YES];
    } else {
        [annotationView setSelected:YES animated:YES];
    }
}
于 2012-11-30T21:06:01.353 回答
0

您可以使用以下 Swift 扩展方法来提供帮助。最流行的答案是使用链接的帮助程序库导致图像模糊。

extension UIImage {

    func rotated(degrees degrees : Int) -> UIImage {
        // calculate the size of the rotated view's containing box for our drawing space
        let rotatedViewBox = UIView(frame: CGRectMake(0,0,self.size.width, self.size.height))
        let rotation = CGFloat(degrees) * CGFloat(M_PI) / 180
        let t = CGAffineTransformMakeRotation(rotation);
        rotatedViewBox.transform = t;
        let rotatedSize = rotatedViewBox.frame.size;
        UIGraphicsBeginImageContextWithOptions(rotatedSize, false, 0.0);
        let context = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(context, rotatedSize.width/2, rotatedSize.height/2);
        CGContextRotateCTM(context, rotation);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextDrawImage(context, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), self.CGImage);
        let rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return rotatedImage;
    }
}

用法:

annotationView.image = UIImage(named: "my_image")!.rotated(degrees: 45)
于 2015-12-03T19:46:05.323 回答
-2

// 只需在添加子视图之前设置图像属性,它就像魅力一样工作

MKAnnotationView *aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"];
UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"mapPin.png"]];

aView.image = [UIImage imageNamed:@"mapPin.png"];   //   just this line

[aView addSubview:iv];
aView.canShowCallout = YES;
于 2013-05-15T12:49:23.803 回答