iOS自定义注释:注释引脚下方的视图

我需要用我的自定义注释视图replace默认的注释视图。

我需要做以下事情:

  1. 自定义注释视图中embedded了图像视图。
  2. 在它下面的视图中包含一个标签。

要了解更多信息,请参阅图像:

样品引脚

在上面的图片中,我需要在图片视图中放置一个可以在图片中看到的圆形图片,接下来我还需要添加一个包含标签的视图,在该图片上可以设置像我这样的文本,朋友,等等…

所以,为此,我search了堆栈溢出的问题的数目,但没有得到我的答案。 我不想让它出来,我只是想把它作为地图渲染时的注释。 我试图为此做一个自定义的类,但不知道如何处理这个。

任何帮助将不胜感激

您可以创build自己的注释视图:

@import MapKit; @interface CustomAnnotationView : MKAnnotationView @end @interface CustomAnnotationView () @property (nonatomic) CGSize textSize; @property (nonatomic) CGSize textBubbleSize; @property (nonatomic, weak) UILabel *label; @property (nonatomic) CGFloat lineWidth; @property (nonatomic) CGFloat pinRadius; @property (nonatomic) CGFloat pinHeight; @property (nonatomic, strong) UIBezierPath *pinPath; @property (nonatomic, strong) UIBezierPath *textBubblePath; @end @implementation CustomAnnotationView - (instancetype)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; if (self) { self.lineWidth = 1.0; self.pinHeight = 40; self.pinRadius = 15; UILabel *label = [[UILabel alloc] init]; label.textAlignment = NSTextAlignmentCenter; label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout]; label.textColor = [UIColor whiteColor]; [self addSubview:label]; self.label = label; [self adjustLabelWidth:annotation]; self.opaque = false; } return self; } - (void)setAnnotation:(id<MKAnnotation>)annotation { [super setAnnotation:annotation]; if (annotation) [self adjustLabelWidth:annotation]; } - (void)adjustLabelWidth:(id<MKAnnotation>)annotation { NSString *title = [annotation title]; NSDictionary *attributes = @{NSFontAttributeName : self.label.font}; self.textSize = [title sizeWithAttributes:attributes]; CGFloat delta = self.textSize.height * (1.0 - sinf(M_PI_4)) * 0.55; self.textBubbleSize = CGSizeMake(self.textSize.width + delta * 2, self.textSize.height + delta * 2); self.label.frame = CGRectMake(0, self.pinHeight, self.textBubbleSize.width, self.textBubbleSize.height); self.label.text = title; self.frame = CGRectMake(0, 0, self.textBubbleSize.width, self.pinHeight + self.textBubbleSize.height); self.centerOffset = CGPointMake(0, self.frame.size.height / 2.0 - self.pinHeight); } - (void)drawRect:(CGRect)rect { CGFloat radius = self.pinRadius - self.lineWidth / 2.0; CGPoint startPoint = CGPointMake(self.textBubbleSize.width / 2.0, self.pinHeight); CGPoint center = CGPointMake(self.textBubbleSize.width / 2, self.pinRadius); CGPoint nextPoint; // pin self.pinPath = [UIBezierPath bezierPath]; [self.pinPath moveToPoint:startPoint]; nextPoint = CGPointMake(self.textBubbleSize.width / 2 - radius, self.pinRadius); [self.pinPath addCurveToPoint:nextPoint controlPoint1:CGPointMake(startPoint.x, startPoint.y - (startPoint.y - nextPoint.y) / 2.0) controlPoint2:CGPointMake(nextPoint.x, nextPoint.y + (startPoint.y - nextPoint.y) / 2.0)]; [self.pinPath addArcWithCenter:center radius:radius startAngle:M_PI endAngle:0 clockwise:TRUE]; nextPoint = startPoint; startPoint = self.pinPath.currentPoint; [self.pinPath addCurveToPoint:nextPoint controlPoint1:CGPointMake(startPoint.x, startPoint.y - (startPoint.y - nextPoint.y) / 2.0) controlPoint2:CGPointMake(nextPoint.x, nextPoint.y + (startPoint.y - nextPoint.y) / 2.0)]; [[UIColor blackColor] setStroke]; [[UIColor colorWithRed:0.0 green:0.5 blue:1.0 alpha:0.8] setFill]; self.pinPath.lineWidth = self.lineWidth; [self.pinPath fill]; [self.pinPath stroke]; [self.pinPath closePath]; // bubble around label if ([self.annotation.title length] > 0) { self.textBubblePath = [UIBezierPath bezierPath]; CGRect bubbleRect = CGRectInset(CGRectMake(0, self.pinHeight, self.textBubbleSize.width, self.textBubbleSize.height), self.lineWidth / 2, self.lineWidth / 2); self.textBubblePath = [UIBezierPath bezierPathWithRoundedRect:bubbleRect cornerRadius:bubbleRect.size.height / 2]; self.textBubblePath.lineWidth = self.lineWidth; [self.textBubblePath fill]; [self.textBubblePath stroke]; } else { self.textBubblePath = nil; } // center white dot self.pinPath = [UIBezierPath bezierPathWithArcCenter:center radius:radius / 3.0 startAngle:0 endAngle:M_PI * 2.0 clockwise:TRUE]; self.pinPath.lineWidth = self.lineWidth; [[UIColor whiteColor] setFill]; [self.pinPath fill]; } - (UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event { if ([self.pinPath containsPoint:point] || [self.textBubblePath containsPoint:point]) return self; return nil; } @end 

这产生了类似于:

在这里输入图像说明

显然,你可以自定义这个内容,但是它说明了基本思想:编写一个覆盖initWithAnnotation:reuseIdentifier:重载MKAnnotationView initWithAnnotation:reuseIdentifier:并实现你自己的drawRect