iOS开发中移动UIButton时保持可点击状态的问题求解
问题根因
UIView动画执行过程中,控件的真实frame/center会在动画启动时直接跳转到最终值,屏幕上看到的移动效果只是*图层呈现树(presentation tree)*的临时渲染结果。默认的点击命中检测是基于控件的真实frame,所以只会在动画结束的最终位置响应,.allowUserInteraction选项仅允许动画过程中用户交互生效,不会修改命中检测的判断逻辑。
解决方案
你可以通过重写父视图的点击检测逻辑,在点击时基于按钮的呈现层坐标做判断,即可命中动画过程中的按钮:
- 在按钮所在的父视图类中添加如下重写方法:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { // 检查点击是否落在动画中按钮的呈现层范围内 if let presentationLayer = clickButton.layer.presentation(), presentationLayer.hitTest(convert(point, to: clickButton.superview)) != nil { return clickButton } return super.hitTest(point, with: event) }
- 原有动画代码不需要修改,保持
.allowUserInteraction选项即可。
如果需要适配多个支持动画中点击的控件,可以遍历父视图下所有目标控件,逐个判断呈现层的命中情况即可。
内容的提问来源于stack exchange,提问作者my_expendableaccount
相关产品推荐
相关产品推荐

