iOS 原生地圖MKMapView上添加圖片遮蓋物

未添加遮蓋物效果:


WechatIMG2.png

添加遮蓋物后效果:


WechatIMG3.png

MKMapView上添加圖片遮蓋物的原理和添加軌跡的原理基本相同(軌跡可參考上一篇文章)矛缨,都需要自定義圖層(實(shí)現(xiàn)MKOverlay協(xié)議)和渲染器(繼承MKOverlayRenderer)碘裕。

CustomOverlay.h實(shí)現(xiàn):

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface CustomOverlay : NSObject<MKOverlay>

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, readonly) MKMapRect boundingMapRect;

- (id)initWithRect:(MKMapRect)rect;

@end

CustomOverlay.m實(shí)現(xiàn):

#import "CustomOverlay.h"

@interface CustomOverlay ()

@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate;
@property (nonatomic, readwrite) MKMapRect boundingMapRect;

@end

@implementation CustomOverlay

@synthesize coordinate      = _coordinate;
@synthesize boundingMapRect = _boundingMapRect;

#pragma mark - Initalize

- (id)initWithRect:(MKMapRect)rect
{
    if (self = [super init])
    {
        self.boundingMapRect = rect;
    }
    
    return self;
}

@end

CustomOverlayRenderer.h實(shí)現(xiàn):

#import <MapKit/MapKit.h>

@interface CustomOverlayRenderer : MKOverlayRenderer

@end

CustomOverlayRenderer.m實(shí)現(xiàn):(注意:繪制image要先轉(zhuǎn)CGImageRef在繪制,網(wǎng)上很多方式甚至高德提供的繪制方法都會讓cpu瞬間200%镀钓,真機(jī)調(diào)試用不到5分鐘就燙手了居灯。祭务。。)

#import "CustomOverlayRenderer.h"
#import "CustomOverlay.h"

@interface CustomOverlayRenderer ()

@property (nonatomic, strong) UIImage *image;

@end

@implementation CustomOverlayRenderer

- (id) initWithOverlay:(id<MKOverlay>)overlay{
    self = [super initWithOverlay:overlay];
    if (self){
        self.image = [UIImage imageNamed:@"MapHiddenBG.png"];
    }
    return self;
}

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    @autoreleasepool {
        CustomOverlay *overlay = (CustomOverlay *)self.overlay;
        
        if (overlay == nil)
        {
            NSLog(@"overlay is nil");
            return;
        }
        
        MKMapRect theMapRect    = [self.overlay boundingMapRect];
        CGRect theRect          = [self rectForMapRect:theMapRect];
        
        // 繪制image
        CGImageRef imageReference = self.image.CGImage;
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextTranslateCTM(context, 0.0, -theRect.size.height);
        CGContextDrawImage(context, theRect, imageReference);
    }
}
@end

類都實(shí)現(xiàn)了怪嫌,剩下的就是正確的在地圖上添加我們自定義的圖層:(前面那一堆都是計(jì)算軌跡在屏幕中顯示位置的义锥,也是根我項(xiàng)目相關(guān),可不用理睬)

//設(shè)置地圖在可見范圍
    MKMapRect mapRect = MKMapRectNull;
    for ( NSDictionary *dic in self.runningData.locationArray) {
        CLLocationDegrees latitude  = [dic[@"latitude"] doubleValue];
        CLLocationDegrees longitude = [dic[@"longitude"] doubleValue];
        CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
        
        MKMapPoint annotationPoint = MKMapPointForCoordinate(coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
        if (MKMapRectIsNull(mapRect)) {
            mapRect = pointRect;
        } else {
            mapRect = MKMapRectUnion(mapRect, pointRect);
        }
    }
    
    const CGFloat screenEdgeInset = kScreenEdgeInset;
    UIEdgeInsets mapInset = UIEdgeInsetsMake(screenEdgeInset, screenEdgeInset, screenEdgeInset*8, screenEdgeInset);
    mapRect = [self.mapView mapRectThatFits:mapRect edgePadding:mapInset];
    [self.mapView setVisibleMapRect:mapRect edgePadding:mapInset animated:NO];
    
    //添加圖片遮蓋層
    self.mapHiddenImageOverlay = [[CustomOverlay alloc] initWithRect:self.mapView.visibleMapRect];
    [self.mapView addOverlay:self.mapHiddenImageOverlay level:1];

添加上了岩灭,便會調(diào)用rendererForOverlay這個(gè)代理方法:(viewForOverlay別實(shí)現(xiàn)這個(gè)了拌倍,這個(gè)方法已經(jīng)標(biāo)注ios7以后會隨時(shí)銷毀,再信蘋果一次噪径,即便很多標(biāo)注銷毀的方法到今天為止也沒有幾個(gè)真正銷毀的)

#pragma mark -
#pragma mark - MKMapView Delegate
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay{
    if([overlay isKindOfClass:[CustomOverlay class]]){
        //遮擋地圖圖片
        CustomOverlayRenderer *renderer = [[CustomOverlayRenderer alloc] initWithOverlay:overlay];
        return renderer;
    }
    return nil;
}

到此柱恤,地圖上圖片遮蓋物的功能已經(jīng)實(shí)現(xiàn)了,但美中不足的是CustomOverlayRenderer中drawMapRect是按順序加載瓦礫找爱,也就是一塊一塊繪制梗顺,性能不好的手機(jī)上瓦礫的加載效果還是很明顯的,暫時(shí)還沒找到一次性繪制整張圖片的方法缴允,求指點(diǎn)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荚守,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子练般,更是在濱河造成了極大的恐慌矗漾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薄料,死亡現(xiàn)場離奇詭異敞贡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摄职,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門誊役,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谷市,你說我怎么就攤上這事蛔垢。” “怎么了迫悠?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵鹏漆,是天一觀的道長。 經(jīng)常有香客問我,道長艺玲,這世上最難降的妖魔是什么括蝠? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮饭聚,結(jié)果婚禮上忌警,老公的妹妹穿的比我還像新娘。我一直安慰自己秒梳,他們只是感情好法绵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酪碘,像睡著了一般礼烈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婆跑,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天此熬,我揣著相機(jī)與錄音,去河邊找鬼滑进。 笑死犀忱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扶关。 我是一名探鬼主播阴汇,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼节槐!你這毒婦竟也來了搀庶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铜异,失蹤者是張志新(化名)和其女友劉穎哥倔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍庄,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咆蒿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚂子。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃测。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖食茎,靈堂內(nèi)的尸體忽然破棺而出蒂破,到底是詐尸還是另有隱情,我是刑警寧澤别渔,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布附迷,位于F島的核電站田巴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挟秤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一抄伍、第九天 我趴在偏房一處隱蔽的房頂上張望艘刚。 院中可真熱鬧,春花似錦截珍、人聲如沸攀甚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秋度。三九已至,卻和暖如春钱床,著一層夾襖步出監(jiān)牢的瞬間荚斯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工查牌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留事期,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓纸颜,卻偏偏與公主長得像兽泣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子胁孙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容