带模糊效果的自定义UIView上UISwipeGestureRecognizer触发不稳定问题
解决自定义通知视图手势不触发的问题
核心问题:视图位置超出可交互区域
你的通知视图当前的布局约束将它放在了safeArea上方的状态栏区域,系统会拦截这个区域的触摸事件,导致滑动/点击手势无法被检测到:
// 原约束:视图位于safeArea顶部上方60点,属于状态栏区域 notificationView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 60)
解决方案:调整布局到safeArea内部
修改positionNotification方法中的布局约束,将通知视图放在safeArea的可见交互区域内,比如紧贴safeArea顶部:
private func positionNotification(_ notificationView: UIView, above previousNotificationView: UIView?) { notificationView.translatesAutoresizingMaskIntoConstraints = false if let previousView = previousNotificationView { NSLayoutConstraint.activate([ notificationView.bottomAnchor.constraint(equalTo: previousView.topAnchor, constant: -10), notificationView.centerXAnchor.constraint(equalTo: view.centerXAnchor), notificationView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.9), notificationView.heightAnchor.constraint(equalToConstant: 60) ]) } else { NSLayoutConstraint.activate([ // 修改为top锚定到safeArea顶部,添加间距 notificationView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10), notificationView.centerXAnchor.constraint(equalTo: view.centerXAnchor), notificationView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.9), notificationView.heightAnchor.constraint(equalToConstant: 60) ]) } }
额外检查点
- 验证视图可见范围:给
notificationView设置临时背景色(比如.red.withAlphaComponent(0.5)),确认它完全显示在屏幕的可触摸区域内,没有被状态栏或其他系统元素覆盖。 - 确认手势添加对象正确:你已经将手势添加到
notificationView上,且notificationView.isUserInteractionEnabled = true,这部分是正确的;UIVisualEffectView设置了isUserInteractionEnabled = false,不会拦截触摸事件,无需修改。 - 排查手势冲突:如果后续添加其他手势,可实现
UIGestureRecognizerDelegate的gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)方法,允许手势同时触发,但当前场景下不需要。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

