到目前为止,这里提到的内容对我来说并不奏效,但我根据其他答案和一些独立研究管理了一个解决方案。我对此不是 100% 确定的,但是如果您使用在内部调用正确的“init”方法的静态方法调用,您可以将 MKPolyline 转换为自定义子类仅。
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
上述方法不起作用,因为polylineWithCoordinates 只为MKPolyline 对象而不是CustomPolyline 分配内存。我怀疑内部发生的事情是polylineWithCoordinates 以类似于[MKPolyline otherInitMethod:...] 的方式调用另一个初始化方法。而且它没有分配适当的内存量,因为它现在使用MKPolyline 静态方法调用而不是我们的CustomPolyline 静态调用。
但是如果我们使用
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
确实有效。我认为这是因为polylineWithPoints 正在使用一个返回id 的初始化程序,而不仅仅是链接到另一个方法调用。由于我们使用CustomPolyline 类调用它,初始化程序为CustomPolyline 而不是MKPolyline 分配内存。
我可能完全错了它为什么起作用。但我已经对此进行了测试,它似乎工作正常。 MKPolygon 可以以类似的方式扩展。在那种情况下,我认为正确的静态方法是MKPolygon polygonWithCoordinates:points count:pointSet.count]]
我的实现供参考:
CustomPolyline.h
#import <MapKit/MapKit.h>
typedef enum {
CustomPolylineTypeNone = 0,
CustomPolylineDifferentStrokes
} CustomPolylineType;
/**
* CustomPolyline wraps MKPolyline with additional information about a polyline useful for differentiation.
*/
@interface CustomPolyline : MKPolyline
@property CustomPolylineType type;
-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline;
@end
CustomPolyline.m
#import "CustomPolyline.h"
@implementation CustomPolyline
@synthesize type;
/**
* Takes an MKPolyline and uses its attributes to create a new CustomPolyline
*/
-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline
{
// We must use the this specific class function in this manner to generate an actual
// CustomPolyline object as opposed to a MKPolyline by a different name
return (CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
}
@end