引脚一侧的iOS MapKit自定义标注

时间:2014-05-05 12:26:54

标签: ios objective-c uiview mkmapview mkannotationview

我想为iOS实现一个自定义标注视图,该视图显示在被轻敲的引脚的右侧。我最终做的方式有点像this教程。
基本上我在mapView中添加了一个子视图到注释视图:didSelectAnnotationView:delegate callback(第二个​​参数是注释视图)。它显示了我的喜好,但它无法接收触摸事件。我发现它是(可能是),因为我添加的UIView不在注释视图的框架中,如果我点击框架中仍然存在的边缘,它会被识别,但是没有其他地方。我还没有找到任何其他方式来做这样的事情,我不知道如何让UIView中的触摸工作。 我尝试使注释视图的框架更大,但它也使得引脚(图像)更大,这不是一种方法。

有什么想法吗?

1 个答案:

答案 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];
}