我正在忙着制作一个应用程序,如果一个坐标点击其中一个多边形,我想要显示UIAlerView
。
我得到了这个,它工作正常:
for (id<MKOverlay> overlay in myMapView.overlays)
{
if ([overlay isKindOfClass:[MKPolygon class]])
{
MKPolygon *polygon = (MKPolygon *)overlay;
CGMutablePathRef mpr = CGPathCreateMutable();
MKMapPoint *polygonPoints = polygon.points;
for (int p=0; p < polygon.pointCount; p++)
{
MKMapPoint mp = polygonPoints[p];
if (p == 0)
CGPathMoveToPoint(mpr, NULL, mp.x, mp.y);
else
CGPathAddLineToPoint(mpr, NULL, mp.x, mp.y);
}
CGPoint mapPointAsCGP = CGPointMake(mapPointToTest.x, mapPointToTest.y);
BOOL pointIsInPolygon = CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE);
NSLog(@"Coordinate %f,%f is in polygon %@: %@",
coordinateToTest.latitude, coordinateToTest.longitude,
polygon.title,
(pointIsInPolygon ? @"Yes" : @"No"));
if (pointIsInPolygon == 1) {
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Uw vuilnisdag" message:@"Op dinsdag 06:00 en vrijdag 06:00" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Stel notificatie in", nil];
[alertView show];
} else {
UIAlertView *alertViewN = [[UIAlertView alloc]initWithTitle:@"Sorry" message:@"Geen ophaaldag gevonden in uw gebied" delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
[alertViewN show];
}
CGPathRelease(mpr);
}
}
在for循环中,CGPathContainsPoint
代码会检查所有MKPolygon
。
最后我得到一个结果:1或0。
现在的问题是,如果结果是0,我会得到8次AlertView。 有没有一种简单的方法来摆脱这个? 感谢
更新1
这是警告View委托。 不确定要在buttonIndex == 0中放入什么值。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 0 ){
//
}
}
更新2
这是我到目前为止所得到的。
我正在玩isKindOfClass:[NSString class]
..没有成功。
BOOL pointIsInPolygon = CGPathContainsPoint(mpr, NULL, mapPointAsCGP, FALSE);
NSLog(@"Coordinate %f,%f is in polygon %@: %@",
coordinateToTest.latitude, coordinateToTest.longitude,
polygon.title,
(pointIsInPolygon ? @"Yes" : @"No"));
if (pointIsInPolygon == 1) {
pointIsInPolygon = TRUE;
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Uw vuilnisdag" message:@"Op dinsdag 06:00 en vrijdag 06:00" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Stel notificatie in", nil];
//[alertView show];
} else {
UIAlertView *alertViewN = [[UIAlertView alloc]initWithTitle:@"Sorry" message:@"Geen ophaaldag gevonden in uw gebied" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil];
//[alertViewN show];
}
CGPathRelease(mpr);
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
//this would be the yes button or cancel
if (buttonIndex == 0 ){
NSLog(@"ButtonIndex Okay");
}
}
答案 0 :(得分:0)
您必须在创建时将警报视图的委托设置为self
,并实现在取消警报时执行的委托方法。在演示后,请保留对警报视图的引用。
在警报视图委托方法中(在用户关闭警报视图后),将引用重置为nil
。当您满足显示警报视图的条件时,仅在引用等于nil
时显示。
修改强> 在您的特定情况下:
它说:
if (pointIsInPolygon == 1){
// ...
}
不是显示警报,而是将标志设置为true。循环浏览所有八个元素后,如果该标志为真,则仅显示1个警告。