我希望用户能够在地图上放置一些(未知数字)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;

还要注意的另一重要事项是,将按点在阵列中的顺序绘制多边形边。如果用户未按顺时针或逆时针顺序添加角,则多边形将看起来很奇怪。您可以在用户添加/删除注释后立即重新创建多边形叠加层,以便他们立即获得有关其外观的反馈。

10-08 05:48
查看更多