3

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

}
4

1 回答 1

1

第一个问题是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函数返回传递的变量使用的物理内存的字节数。对于ptsArraywhich 是一个指针,它将返回 4。如果ptsArray有少于 4 个项目,您将得到“索引超出范围”异常。

所以改变

int cornersNumber = sizeof(ptsArray);

int cornersNumber = ptsArray.count;


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

于 2011-11-11T16:23:17.183 回答