我希望用户能够在地图上放置一些(未知数字)MKpointAnnotations之后创建多边形。我已经放置了一个手势识别器,一旦用户点击一个按钮,它就会被激活,因此放置了注释。但是如何使用它们MKPolygon的角落?
保存代码的代码下面是多边形的代码,经过一些修改后我对它进行了处理,现在应用崩溃了,崩溃报告者说索引超出了范围,这些角落是通过GestureRecognizer创建的MKPointAnnotation-s。
-(IBAction)addCorner:(id)sender
{
NSMutableArray *addCorners = [[NSMutableArray alloc] init];
[addCorners addObject:pointAnnotation];
ptsArray = addCorners;
}
-(IBAction)addPolygonOverlay:(id)sender
{
int cornersNumber = sizeof(ptsArray);
MKMapPoint points[cornersNumber];
for (int i=0; i<cornersNumber; i++) {
points[i] = MKMapPointForCoordinate([[ptsArray objectAtIndex:i] coordinate]);
}
MKPolygon *polygon = [MKPolygon polygonWithPoints:points count:cornersNumber];
[mapview addOverlay:polygon];
}
最佳答案
第一个问题是addCorner
方法。它没有将每个角添加到ptsArray
变量中,而是创建了一个仅包含最后一个角的新数组,并将ptsArray
设置为等于该数组,因此它只有一个最后一个角。
像这样更改addCorner
方法:
-(IBAction)addCorner:(id)sender
{
if (ptsArray == nil)
{
self.ptsArray = [NSMutableArray array];
}
[ptsArray addObject:pointAnnotation];
}
还要确保
ptsArray
正确声明和合成://in the .h file...
@property (nonatomic, retain) NSMutableArray *ptsArray;
//in the .m file...
@synthesize ptsArray;
(顺便说一句,为什么不在创建
ptsArray
的位置添加到pointAnnotation
的角落,而不是在单独的用户操作中添加?)第二个问题是
addPolygonOverlay
方法。您必须使用NSArray
count
属性来获取数组中的项目数。 sizeof
函数返回传递的变量使用的物理内存的字节数。对于作为指针的ptsArray
,它将返回4。如果ptsArray
少于4个项目,则将出现“索引超出范围”异常。所以改变
int cornersNumber = sizeof(ptsArray);
至
int cornersNumber = ptsArray.count;
还要注意的另一重要事项是,将按点在阵列中的顺序绘制多边形边。如果用户未按顺时针或逆时针顺序添加角,则多边形将看起来很奇怪。您可以在用户添加/删除注释后立即重新创建多边形叠加层,以便他们立即获得有关其外观的反馈。