高德地图大头针功能_iOS高德地图之自定义大头针and泡泡view

这篇博客介绍了如何在iOS应用中使用高德地图API自定义大头针和点击大头针时弹出的泡泡视图(callout view)。通过创建CustomAnnotationView和CustomCalloutView类,实现大头针的个性化展示,并解决泡泡视图超出父控件的事件响应问题。同时,给出了MAMapViewDelegate的相关回调方法,确保大头针选择时气泡视图能完全显示。
摘要由CSDN通过智能技术生成

啥都不说先看效果图demo

IMG_0270.PNG

先来说说如何自定义大头针以及点击大头针时弹出的泡泡view

一 : 自定义大头针

新建CustomAnnotationView 继承自MAAnnotationView

添加属性

重写- (id)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier

重写- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 解决泡泡view超出父控件事件响应问题

重写- (void)setSelected:(BOOL)selected animated:(BOOL)animated

二 : 自定义泡泡View

新建自定义气泡类 CustomCalloutView,继承 UIView。

在 CustomCalloutView.h 中定义数据属性,包含:图片、商户名和商户地址。(随便你怎么搞,在这里我就搞了一个xib)

Snip20170620_1.png

在上面新建的CustomAnnotationView.h中定义自定义气泡属性

#import "CustomCalloutView.h"

@interface CustomAnnotationView : MAAnnotationView

@property (nonatomic, readonly) CustomCalloutView *calloutView;

@end

重写选中方法- (void)setSelected:(BOOL)selected animated:(BOOL)animated。选中时新建并添加calloutView,传入数据;非选中时删除calloutView。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated

{

if (self.selected == selected)

{

return;

}

if (selected)

{

if (self.calloutView == nil)

{

/* Construct custom callout. */

self.calloutView = [CustomCalloutView calloutView];

self.calloutView.frame = CGRectMake(0, 0, kCalloutWidth, kCalloutHeight);

self.calloutView.center = CGPointMake(CGRectGetWidth(self.bounds) / 2.f + self.calloutOffset.x,

-CGRectGetHeight(self.calloutView.bounds) / 2.f + self.calloutOffset.y);

}

[self addSubview:self.calloutView];

}

else

{

[self.calloutView removeFromSuperview];

}

[super setSelected:selected animated:animated];

}

修改ViewController.m,在MAMapViewDelegate的回调方法mapView:viewForAnnotation中的修改annotationView的类型

#pragma mark - MAMapViewDelegate

- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)annotation

{

if ([annotation isKindOfClass:[MAPointAnnotation class]])

{

static NSString *customReuseIndetifier = @"customReuseIndetifier";

CustomAnnotationView *annotationView = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:customReuseIndetifier];

if (annotationView == nil)

{

annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customReuseIndetifier];

// must set to NO, so we can show the custom callout view.

annotationView.canShowCallout = NO;

annotationView.draggable = YES;

annotationView.calloutOffset = CGPointMake(0, -5);

}

return annotationView;

}

return nil;

}

用于调整泡泡view显示不全问题

- (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view

{

/* Adjust the map center in order to show the callout view completely. */

if ([view isKindOfClass:[CustomAnnotationView class]]) {

CustomAnnotationView *cusView = (CustomAnnotationView *)view;

CGRect frame = [cusView convertRect:cusView.calloutView.frame toView:self.mapView];

frame = UIEdgeInsetsInsetRect(frame, UIEdgeInsetsMake(kCalloutViewMargin, kCalloutViewMargin, kCalloutViewMargin, kCalloutViewMargin));

if (!CGRectContainsRect(self.mapView.frame, frame))

{

/* Calculate the offset to make the callout view show up. */

CGSize offset = [self offsetToContainRect:frame inRect:self.mapView.frame];

CGPoint theCenter = self.mapView.center;

theCenter = CGPointMake(theCenter.x - offset.width, theCenter.y - offset.height);

CLLocationCoordinate2D coordinate = [self.mapView convertPoint:theCenter toCoordinateFromView:self.mapView];

[self.mapView setCenterCoordinate:coordinate animated:YES];

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值