我遇到MKAnnotationView Frame问题。在询问之前我想澄清一些事情。
首先:
我有一个MKMapView
和一些自定义注释:
看起来不错。
其次,我通过MKPolylineView
在用户的位置和此自定义注释之间绘制一条线:
看起来很不错
第三,然后我尝试通过自己的自定义更改默认注释图像:
就在这里,我们有错误的结果,coz注释与行
无关Forth,Okey我试图改变这张图片的位置:
我刚刚使用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;
}
毕竟:
这就是我想要的:)
但有时当我点按此注释didSelectAnnotationView:
时,我不会被调用。我知道为什么,用UIView
中的我的图片来表达MKAnnotation
。
我更改了MKAnnotation
的背景颜色:
当我点按此红色区域时,didSelectAnnotationView:
被调用。
那么,问题是如何更改此MKAnnotationView
的框架,以便我的UIView
不在外面?
P.S。我尝试改变框架,不起作用:D
P.S.S抱歉我的英文:(
答案 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)]];
}