// // KCCalloutView.h // MapKit // // Created by jeffasd on 14/3/27. // Copyright (c) 2014年 jeffasd. All rights reserved. // 自定义弹出标注视图 #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> #import "KCCalloutAnnotation.h" @interface KCCalloutAnnotationView : MKAnnotationView @property (nonatomic ,strong) KCCalloutAnnotation *annotation;//覆盖父类annotation属性 #pragma mark 从缓存取出标注视图 +(instancetype)calloutViewWithMapView:(MKMapView *)mapView; +(instancetype)initCalloutViewWithMapView:(MKMapView *)mapView setKCCalloutAnnotation :(KCCalloutAnnotation *)kcCalloutAnnotation; @end
// // KCCalloutView.m // MapKit // // Created by jeffasd on 14/3/27. // Copyright (c) 2014年 jeffasd. All rights reserved. // #import "KCCalloutAnnotationView.h" #define kSpacing 5 #define kDetailFontSize 12 //#define kViewOffset 180 #define kViewOffset 80 //#define USE_SYSTHESIZE @interface KCCalloutAnnotationView(){ UIView *_backgroundView; UIImageView *_iconView; UILabel *_detailLabel; UIImageView *_rateView; } @end @implementation KCCalloutAnnotationView #ifdef USE_SYSTHESIZE @synthesize annotation = _annotation; //不会使用父类的set方法 在 setAnnotation方法里 要明确表明 _annotation = annotation; #else @dynamic annotation; //用@dynamic后 get 和 set 方法应该获取到的是父类类型的 annotation #endif -(instancetype)init{ if(self=[super init]){ [self layoutUI]; } return self; } -(instancetype)initWithFrame:(CGRect)frame{ if (self=[super initWithFrame:frame]) { [self layoutUI]; } return self; } -(void)layoutUI{ //背景 _backgroundView=[[UIView alloc]init]; _backgroundView.backgroundColor=[UIColor whiteColor]; //左侧添加图标 _iconView=[[UIImageView alloc]init]; //上方详情 _detailLabel=[[UILabel alloc]init]; _detailLabel.lineBreakMode=NSLineBreakByWordWrapping; //[_text sizeToFit]; _detailLabel.font=[UIFont systemFontOfSize:kDetailFontSize]; //下方星级 _rateView=[[UIImageView alloc]init]; [self addSubview:_backgroundView]; [self addSubview:_iconView]; [self addSubview:_detailLabel]; [self addSubview:_rateView]; } +(instancetype)calloutViewWithMapView:(MKMapView *)mapView{ static NSString *calloutKey=@"calloutKey1"; KCCalloutAnnotationView *calloutView=(KCCalloutAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:calloutKey]; if (!calloutView) { calloutView=[[KCCalloutAnnotationView alloc]init]; } return calloutView; } +(instancetype)initCalloutViewWithMapView:(MKMapView *)mapView setKCCalloutAnnotation :(KCCalloutAnnotation *)kcCalloutAnnotation { static NSString *calloutKey=@"calloutKey1"; KCCalloutAnnotationView *calloutView=(KCCalloutAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:calloutKey]; if (!calloutView) { calloutView=[[KCCalloutAnnotationView alloc] initWithAnnotation:kcCalloutAnnotation reuseIdentifier:calloutKey]; } return calloutView; } #ifdef USE_SYSTHESIZE #pragma mark 当给大头针视图设置大头针模型时可以在此根据模型设置视图内容 @synthesize annotation = _annotation; -(void)setAnnotation:(KCCalloutAnnotation *)annotation{ _annotation = annotation; // //根据模型调整布局 _iconView.image=annotation.icon; _iconView.frame=CGRectMake(kSpacing, kSpacing, annotation.icon.size.width, annotation.icon.size.height); // _detailLabel.text=annotation.detail; float detailWidth=150.0; CGSize detailSize= [annotation.detail boundingRectWithSize:CGSizeMake(detailWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kDetailFontSize]} context:nil].size; float detailX=CGRectGetMaxX(_iconView.frame)+kSpacing; _detailLabel.frame=CGRectMake(detailX, kSpacing, detailSize.width, detailSize.height); _rateView.image=annotation.rate; _rateView.frame=CGRectMake(detailX, CGRectGetMaxY(_detailLabel.frame)+kSpacing, annotation.rate.size.width, annotation.rate.size.height); // float backgroundWidth=CGRectGetMaxX(_detailLabel.frame)+kSpacing; float backgroundHeight=_iconView.frame.size.height+2*kSpacing; _backgroundView.frame=CGRectMake(0, 0, backgroundWidth, backgroundHeight); self.bounds=CGRectMake(0, 0, backgroundWidth, backgroundHeight+kViewOffset); } #else #pragma mark 当给大头针视图设置大头针模型时可以在此根据模型设置视图内容 //@dynamic annotation; -(void)setAnnotation:(KCCalloutAnnotation *)annotation{ [super setAnnotation:annotation]; // //根据模型调整布局 _iconView.image=annotation.icon; _iconView.frame=CGRectMake(kSpacing, kSpacing, annotation.icon.size.width, annotation.icon.size.height); // _detailLabel.text=annotation.detail; float detailWidth=150.0; CGSize detailSize= [annotation.detail boundingRectWithSize:CGSizeMake(detailWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kDetailFontSize]} context:nil].size; float detailX=CGRectGetMaxX(_iconView.frame)+kSpacing; _detailLabel.frame=CGRectMake(detailX, kSpacing, detailSize.width, detailSize.height); _rateView.image=annotation.rate; _rateView.frame=CGRectMake(detailX, CGRectGetMaxY(_detailLabel.frame)+kSpacing, annotation.rate.size.width, annotation.rate.size.height); // float backgroundWidth=CGRectGetMaxX(_detailLabel.frame)+kSpacing; float backgroundHeight=_iconView.frame.size.height+2*kSpacing; _backgroundView.frame=CGRectMake(0, 0, backgroundWidth, backgroundHeight); self.bounds=CGRectMake(0, 0, backgroundWidth, backgroundHeight+kViewOffset); } #endif @end