我正在使用填充了自定义引脚的地图视图。当用户点击地图上的某个地方取消选择一个引脚时,我想实现地图,这样引脚就不会被取消选择(即用户无法在不选择其他引脚的情况下取消选择引脚,因此至少会选择一个引脚)。这是我对didDeselectAnnotationView方法的实现:
-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
[mapView selectAnnotation:view.annotation animated:NO];
}
基本上,我正在尝试重新选择注释。但是,经过一些调试和打印到控制台后,我意识到注释视图实际上并没有被取消选择,直到方法didDeselectAnnotationView:完成运行(即事件顺序为:用户点击地图上的某个地方,didDeselectAnnotationView:被调用并完成执行,实际取消选择注释视图)。有没有其他人遇到过这个问题,或者是否有人知道另一种强制执行地图行为的方法,这样用户无法在不选择其他引脚的情况下取消选择引脚,以便始终选择一个引脚?
感谢您的帮助。
答案 0 :(得分:10)
尝试推迟重新选择,直到didDeselectAnnotationView
完成:
-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
[self performSelector:@selector(reSelectAnnotationIfNoneSelected:)
withObject:view.annotation afterDelay:0];
}
- (void)reSelectAnnotationIfNoneSelected:(id<MKAnnotation>)annotation
{
if (mapView.selectedAnnotations.count == 0)
[mapView selectAnnotation:annotation animated:NO];
}
答案 1 :(得分:1)
编辑:请记住,此方法会阻止选择任何其他引脚,这在创建此答案时是未知的。机会是,这不是你想要的行为。
我知道这是一个老问题,但在iOS 8中,我接受的答案对我没有用。对我有用的是完全禁用UITapGestureRecognizer,默认情况下,它包含在MKMapView中。
- (void)disableTapRecognizerForMapView:(MKMapView *)mapView {
NSArray *a = [[self.mapView.subviews objectAtIndex:0] gestureRecognizers];
for (id gesture in a)
if ([gesture isKindOfClass:[UITapGestureRecognizer class]])
[gesture setEnabled:NO];
}
希望这有助于其他人。
干杯!
答案 2 :(得分:0)
我有类似的问题,但反过来说。
根据所选的引脚,表格将滚动到相应的单元格。如果没有选择引脚,表将滚动回第一个单元格。当选择另一个引脚并且表不会根据需要滚动时,在调用select方法的同时调用deselect方法。
以下代码解决了这个问题,并对Anna的解决方案稍作修改。
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKPinAnnotationView *)view
{
if ([view.annotation isKindOfClass:[MKUserLocation class]])
return;
[self performSelector:@selector(resetTableScroll:)
withObject:view.annotation afterDelay:.5];
}
- (void)resetTableScroll:(id<MKAnnotation>)annotation{
if (theMap.selectedAnnotations.count == 0)
{
NSIndexPath *position = [NSIndexPath indexPathForRow:0 inSection:0];
[[self theTable] scrollToRowAtIndexPath:position atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}}
答案 3 :(得分:0)
安娜的精彩回答。 这里是Swift 3或4中的答案:D
func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
perform(#selector(MyViewController.reSelectAnnotationIfNoneSelected(_:)), with: view.annotation, afterDelay: 0)
}
func reSelectAnnotationIfNoneSelected(_ annotation: MKAnnotation) {
if mapView.selectedAnnotations.count == 0 {
mapView.selectAnnotation(annotation, animated: false)
}
}
答案 4 :(得分:0)
如果您为地图视图添加手势,请尝试以下操作:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
返回NO,它有效