【问题标题】:Creating a MKPolygon from user-placed annotations in map从地图中用户放置的注释创建 MKPolygon
【发布时间】:2011-10-31 15:03:34
【问题描述】:

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

}

【问题讨论】:

  • 如何存储多边形的角(注释)列表?你试过什么?

标签: iphone ios mkmapview mkannotation mkoverlay


【解决方案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 函数返回传递的变量使用的物理内存字节数。 ptsArray 是一个指针,它会返回 4。如果 ptsArray 少于 4 项,你会得到“索引超出范围”的异常。

所以改变

int cornersNumber = sizeof(ptsArray);

int cornersNumber = ptsArray.count;


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

【讨论】:

  • 我明白我做错了什么。我尝试了你所说的,效果很好!顺便说一句,我想我会按照你所说的将角添加到“ptsArray”的正确位置'pointAnnotation' 已创建。我使用 'sizeof' 函数多么愚蠢,我完全忘记了 'count' 属性'。感谢您的所有帮助,真的很珍贵!
  • 我可以征求意见吗?我正在创建两个叠加层并使用手势识别器,一个 LongPressure(1sec)_circle) 和 Tap(poly)。问题是,在我点击了激活这些手势识别器的两个按钮并创建了叠加层之后(首先我已经完成一个圆圈,然后是一个多边形),当我想创建第二个圆圈时,我得到两个引脚,一个“作为点击”,一个在一秒钟后......我想尝试创建一个在“viewdidload”中启动的全局手势识别器' 方法,然后在我之前提到的按钮点击操作方法中本地“自定义” mkmapponits 使用。你怎么看?
  • 您可能想为此提出一个新问题,但一个简单的解决方案是一次只启用一个手势识别器。当用户点击按钮创建圆圈时,启用 long-press-gr 并禁用 tap-gr。当用户点击按钮创建多边形时做相反的事情。在某处显示一个标签,显示当前处于活动状态的 gr 对用户很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多