Iphone 从地图中用户放置的注释创建多边形
我希望用户能够在地图中放置一些(未知数量)MkPointAnnotation后创建多边形。我已经放置了一个手势识别器,一旦用户点击按钮就会激活,因此可以放置批注。但是如何将这些用作MKPolygon的角点? 下面是保存多边形角点的代码。这是在我对其进行了一些修改之后完成的。现在应用程序崩溃,崩溃报告器说索引超出范围。这些角点是通过手势识别器创建的MKPointAnnotation-sIphone 从地图中用户放置的注释创建多边形,iphone,ios,mkmapview,mkannotation,mkoverlay,Iphone,Ios,Mkmapview,Mkannotation,Mkoverlay,我希望用户能够在地图中放置一些(未知数量)MkPointAnnotation后创建多边形。我已经放置了一个手势识别器,一旦用户点击按钮就会激活,因此可以放置批注。但是如何将这些用作MKPolygon的角点? 下面是保存多边形角点的代码。这是在我对其进行了一些修改之后完成的。现在应用程序崩溃,崩溃报告器说索引超出范围。这些角点是通过手势识别器创建的MKPointAnnotation-s -(IBAction)addCorner:(id)sender { NSMutableArray *addCor
-(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];
}
-(iAction)addCorner:(id)发送方
{
NSMutableArray*addCorners=[[NSMutableArray alloc]init];
[addCorners addObject:pointAnnotation];
ptsArray=addCorners;
}
-(iAction)addPolygonOverlay:(id)发送方
{
int cornersumber=sizeof(ptsArray);
MKMapPoint points[拐角数目];
对于(int i=0;i第一个问题是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;
(顺便问一下,为什么不在创建pointAnnotation
的ptsArray
右侧添加角点,而不是在单独的用户操作中?)
第二个问题是addPolygonOverlay
方法。必须使用NSArray
count
属性来获取数组中的项数。sizeof
函数返回传递变量使用的物理内存字节数。对于指针ptsArray
,它将返回4.I如果ptsArray
的项目少于4项,则会出现“索引超出范围”异常
所以改变
int cornersNumber = sizeof(ptsArray);
到
另一个需要注意的重要事项是,多边形边将按照点在数组中的顺序绘制。如果用户不按顺时针或逆时针顺序添加角点,多边形将看起来很奇怪。用户添加/删除注释后,您可以立即重新创建多边形覆盖,以便他们立即获得反馈外观如何。如何存储角点列表(注释)多边形的角?你试过什么?我明白我做错了什么。我试过你说的,效果很好!顺便说一句,我想我会按照你说的,在创建“pointAnnotation”的地方向“ptsArray”添加角点。我使用“sizeof”函数是多么愚蠢,我完全忘记了“count”属性。谢谢你的支持我们的帮助,真的很宝贵!我可以问一个意见吗?我正在创建两个叠加,并使用手势识别器,一个长压(1秒)和点击(多边形)。问题是,在我点击了激活这些手势识别器和创建叠加的两个按钮后(首先我做了一个圆,然后是一个多边形),当我想创建第二个圆时,我会得到两个管脚,一个“作为敲击”,一个接一个…我想尝试创建一个全局手势识别器,该识别器由“viewdidload”方法初始化,然后“customize”Mkmappon在我前面提到的按钮点击动作方法中的局部使用。你认为呢?你可能想问一个新问题,但一个简单的解决方案是一次只启用一个手势识别器。当用户点击按钮创建圆圈时,启用长按gr并禁用tap-gr。当用户点击按钮以创建多边形。在某个地方显示一个标签,显示哪个gr当前处于活动状态,这对用户很有帮助。
int cornersNumber = ptsArray.count;