You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发中移动UIButton时保持可点击状态的问题求解

问题根因

UIView动画执行过程中,控件的真实frame/center会在动画启动时直接跳转到最终值,屏幕上看到的移动效果只是*图层呈现树(presentation tree)*的临时渲染结果。默认的点击命中检测是基于控件的真实frame,所以只会在动画结束的最终位置响应,.allowUserInteraction选项仅允许动画过程中用户交互生效,不会修改命中检测的判断逻辑。

解决方案

你可以通过重写父视图的点击检测逻辑,在点击时基于按钮的呈现层坐标做判断,即可命中动画过程中的按钮:

  1. 在按钮所在的父视图类中添加如下重写方法:
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)
}
  1. 原有动画代码不需要修改,保持.allowUserInteraction选项即可。

如果需要适配多个支持动画中点击的控件,可以遍历父视图下所有目标控件,逐个判断呈现层的命中情况即可。

内容的提问来源于stack exchange,提问作者my_expendableaccount

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:24:00