討厭張貼這些解決方案,但是。 MKMapView本身有很多子視圖。 在它的子視圖層次結構中,有一個類MKTiledView的視圖,它具有TiledLayer作爲圖層。
所以,實際上,您不能以「正常」方式解決渲染通知。
平鋪層通過不斷調用-drawLayer:inContext:它的委託的方法呈現它的內容,哪個MKTiledView是。這些調用可以在不同的線程中同時執行。
您沒有從MKMapView接收聲明(更新),因爲它沒有自行更新。只有它的基本內容正在更新。
所以。存在更好的解決方案。 我的解決方案取決於視圖層次結構和方法的調整。 這取決於你,使用它或不。
創建類別的方法中,我們將張貼需要更新「更新通知」,以自定義視圖
@implementation UIView (Custom)
- (void)drawCustomLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
NSLog(@"Need to draw custom layer :%@ in context %@, Thread: %@", layer, ctx, [NSThread currentThread]);
// Calling old method
[self drawCustomLayer:layer inContext:ctx];
}
@end
//交換MKTiledView的方法實現我們的自定義實現
#import <objc/runtime.h>
Class tileViewclass = NSClassFromString(@"MKMapTileView");
Class viewClass = NSClassFromString(@"UIView");
SEL originalSelector = @selector(drawLayer:inContext:);
SEL newSelector = @selector(drawCustomLayer:inContext:);
Method origMethod = class_getInstanceMethod(tileViewclass, originalSelector);
Method newMethod = class_getInstanceMethod(viewClass, newSelector);
method_exchangeImplementations(origMethod, newMethod);
仍在尋找更好的解決方案。
我已經提交了與此相關的Apple Bug(13774496)(不知道地圖何時完成繪製),並創建了一個示例應用程序來顯示iOS6上仍然存在問題:https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed
@ iWasRobbed真棒!謝謝:) – RedBlueThing