与MKViewAnnotation框架混淆

时间:2014-04-09 12:31:39

标签: ios objective-c mkmapview mkannotation mkannotationview

我遇到MKAnnotationView Frame问题。在询问之前我想澄清一些事情。

首先:

我有一个MKMapView和一些自定义注释: enter image description here

看起来不错。

其次,我通过MKPolylineView在用户的位置和此自定义注释之间绘制一条线:

enter image description here

看起来很不错

第三,然后我尝试通过自己的自定义更改默认注释图像:

enter image description here

就在这里,我们有错误的结果,coz注释与行

无关

Forth,Okey我试图改变这张图片的位置:

enter image description here

我刚刚使用MKAnnotationView添加到UIView新的UIImageView

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    MKAnnotationView *annotationView = nil;
    annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pin"];

    if(!annotationView)
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:person reuseIdentifier:@"pin"];
    else
        annotationView.annotation = annotation;



    UIImageView *avatarImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 25, 25)];
    avatarImage.image = [UIImage imageNamed:avatarName];

    [annotationView setImage:nil];

    avatarImage.layer.masksToBounds = YES;

    UIView *avatarView = [[UIView alloc] initWithFrame:CGRectMake(-7, 23, 30, 30)];
    avatarImage.backgroundColor = [UIColor clearColor];
    avatarView.layer.cornerRadius = 15.0f;


     [avatarView addSubview:avatarImage];
     [annotationView addSubview:avatarView];

     return annotationView;
}

毕竟:

enter image description here

这就是我想要的:)

但有时当我点按此注释didSelectAnnotationView:时,我不会被调用。我知道为什么,用UIView中的我的图片来表达MKAnnotation

我更改了MKAnnotation的背景颜色:

enter image description here

当我点按此红色区域时,didSelectAnnotationView:被调用。

那么,问题是如何更改此MKAnnotationView的框架,以便我的UIView不在外面?

P.S。我尝试改变框架,不起作用:D

P.S.S抱歉我的英文:(

2 个答案:

答案 0 :(得分:1)

我在这里https://stackoverflow.com/a/19404994/1226370对自定义标注视图有很长的解释。

有关触控处理的所有详细信息均在相关答案中说明。

希望它会有用!

更新1

在您继承MKAnnotationView或MKPinAnnotationView之后,您将实现以下两种方法:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        [self.superview bringSubviewToFront:self];
    }
    return hitView;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect rect = self.bounds;
    BOOL isInside = CGRectContainsPoint(rect, point);
    if(!isInside)
    {
        for (UIView *view in self.subviews)
        {
            isInside = CGRectContainsPoint(view.frame, point);
            if(isInside)
                break;
        }
    }
    return isInside;
}

简而言之,在这些方法中,您指定是否应将当前位置的触摸视为触​​摸MKAnnotationView。

因此,如果您想增加注释的触摸区域,则必须对这些方法进行适当的更改。

答案 1 :(得分:0)

我已经解决了这个问题。 我刚刚用MKPinAnnotationView替换了MKAnnotationView,我得到了我需要的东西。

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
                annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pin"];

                if(!annotationView)
                    annotationView = [[MKAnnotationView alloc] initWithAnnotation:person reuseIdentifier:@"pin"];
                else
                    annotationView.annotation = annotation;

                /*
                 Avatar Image
                 */
                annotationView.canShowCallout = NO;

                [annotationView setImage:[self image:[UIImage imageNamed:avatarName] scaledToSize:CGSizeMake(25, 25)]]; 
}