Swift/Xcode:自定义标注视图中按钮无.touchUpInside响应问题
解决自定义Map标注Callout中按钮不响应点击的问题
我之前也踩过这个坑,自定义Callout里的按钮死活不响应touchUpInside事件,大概率是这几个细节没处理好,给你逐一排查:
1. 确保CalloutView开启用户交互
虽然UIView默认userInteractionEnabled是true,但自定义视图偶尔会被意外关闭(比如从xib加载时没勾选)。如果是代码创建的calloutView,手动加上这句保险:
calloutView.isUserInteractionEnabled = true
2. 检查按钮Frame是否超出CalloutView范围
你设置的按钮frame是CGRect(x:16, y:543, width:268, height:30),这个y值543明显太大了!如果你的calloutView本身高度没这么高,按钮就会被放在视图可视范围外,自然接收不到点击。建议改成相对calloutView的布局:
// 让按钮在calloutView内横向居中,顶部留10pt间距 button.frame = CGRect(x: 16, y: 10, width: calloutView.bounds.width - 32, height: 30)
3. 确认标注视图的canShowCallout已开启
你的MKAnnotationView必须开启canShowCallout,否则callout的交互逻辑会失效,记得设置:
yourAnnotationView.canShowCallout = true
4. 验证Target和方法的有效性
你用self作为target,要确保deleteFromAnnot方法所在的ViewController是当前活跃的实例,而且方法签名完全正确(你写的@objc func deleteFromAnnot(sender: UIButton)是符合要求的,这点没问题)。如果按钮是在自定义MKAnnotationView子类里添加的,target要指向实际处理事件的对象,别错用了self。
5. 排查是否有视图遮挡按钮
有时候calloutView上可能有透明视图盖在按钮上方,拦截了点击事件。可以临时给所有子视图加上背景色,看看按钮是不是被挡住了。
把这些点过一遍,应该就能解决按钮不响应的问题了。
内容的提问来源于stack exchange,提问作者Nesvik
相关产品推荐
相关产品推荐

