iOS开发集成高德地图自定义大头针didSelectAnnotationView点击事件时有时无的问题

问题引入:

最近在集成高德地图,自定义大头针.本来没什么问题,其中一个界面是点击大头针跳到另一个页面,带上所点击大头针的数据.然后在做另一个页面的时候,问题就来了.这个页面是点击大头针弹出一个蒙版类型的弹框,点击背景移除弹框,弹框的数据从大头针中获取.弹框消失后再点击大头针,居然无反应,一通乱点后,弹框时有时无.


分析:

经过一番暴力测试后,发现点击蒙版背景让弹框消失之后,再次点击地图内之前点击的大头针以外的区域,再点击大头针就一定能弹出弹框.打断点达到自定义大头针的这两个方法,发现都能进入,但就是不能进入控制器的didSelectAnnotationView代理方法

于是猜测交互是没有问题的,问题应该出在高德内部的处理.联系上面的现象:点一下大头针外部的地图区域再点一下大头针就能进入didSelectAnnotationView代理方法.不难推测出高德的处理是这样的:当我们点击大头针之后,会默认将大头针成为选中状态,选中状态下的大头针无法再次响应didSelectAnnotationView代理事件.(高德希望我们这样使用自定义大头针:点击大头针弹出paopaoView,在paopaoView显示出来的时候,肯定不需要大头针再次响应代理点击事件再弹出paopaoView了,否则连续响应就会重叠显示多个一样的paopaoView了)再次点击paopaoView之外的地图区域后,取消显示paopaoView的同时取消大头针的选中状态.

验证以及解决方法:

在控制器中实现代理方法didDeselectAnnotation,发现点击大头针之后首先进入自定义大头针的setSelect方法,参数值selectd为YES


随后进入控制器代理方法didSelectAnnotationView方法:

再次点击大头针不再进入代理方法,只进入大头针的setSelected方法 ,这时候大头针的select状态仍为YES.所以搞的内部不再让控制器继续执行didSelectAnnotationView方法:

   这时候再点击大头针之外的地图区域,会先进入setSelected方法,参数值为NO,,再进入控制器的didDeselectAnnotation方法.大头针的selected状态变成NO之后,再点击大头针,就会往下执行控制器中实现的didSelectAnnotationView代理方法了:

至此,已经验证了之前的猜测.要解决时有时无的问题,我们在合适的时候手动调用一次deselect方法就行了,在didSelectAnnotationView方法中:

 [mapView deselectAnnotation:anno animated:YES];


猜你喜欢

转载自blog.csdn.net/qq_31186665/article/details/80257261