我想为iOS实现一个自定义标注视图,该视图显示在被轻敲的引脚的右侧。我最终做的方式有点像this教程。
基本上我在mapView中添加了一个子视图到注释视图:didSelectAnnotationView:delegate callback(第二个参数是注释视图)。它显示了我的喜好,但它无法接收触摸事件。我发现它是(可能是),因为我添加的UIView不在注释视图的框架中,如果我点击框架中仍然存在的边缘,它会被识别,但是没有其他地方。我还没有找到任何其他方式来做这样的事情,我不知道如何让UIView中的触摸工作。
我尝试使注释视图的框架更大,但它也使得引脚(图像)更大,这不是一种方法。
有什么想法吗?
答案 0 :(得分:0)
不要在注释中添加子视图,而是继承MKAnnotationView并实现所需的方法。如果您想要完全控制绘图,只需覆盖-drawRect:
。请记住,MKAnnotationView是一个特殊的类,它有点像UITableViewCell,因为它有一些特殊的处理方式可以排队和取消它,你应该直接使用它。这是一个让你开始的例子。
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
[self commonInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self commonInit];
}
return self;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self commonInit];
}
return self;
}
- (id)init
{
self = [super init];
if (self) {
[self commonInit];
}
return self;
}
- (void)commonInit
{
self.frame = CGRectMake(0, 0, 40, 40);
self.backgroundColor = [UIColor clearColor];
self.canShowCallout = YES;
}
- (void)drawRect:(CGRect)rect
{
//// Oval Drawing
CGRect imageBox = CGRectMake(5, 5, 25, 25);
UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect:imageBox];
[[UIColor clouds] setFill];
[ovalPath fill];
[[UIColor clouds] setStroke];
ovalPath.lineWidth = 6;
[ovalPath stroke];
CGFloat radius = imageBox.size.width / 2;
UIImage *img = [UIView rasterizedStatusImageForCheckpoint:self.checkpoint withSize:imageBox.size];
img = [img makeRoundedImage:img radius:radius];
[img drawInRect:imageBox];
}