您的位置:首页 > 移动开发 > IOS开发

iOS 大头针 MKAnnotationView 自定义

2016-01-07 14:04 351 查看
//
//  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: