从屏幕边缘滑过 UICollectionView
Swipe from the edge of screen, over UICollectionView
大家好!
我有:
- 一个视图 - 是 UIViewController 的主视图
- B视图-是UIView和A视图的子视图(A_view.addsubview(B_view))
- C 视图 - 是 A 视图的 UICollectionView 和子视图 ...
什么问题?
我无法在父视图控制器中捕获触摸、滑动事件。
什么意思?
当我尝试使用 :
捕捉触摸事件时
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {...
在视图控制器中我可以看到这样的结果。
我尝试通过添加到 A_view
的 UIScreenEdgePanGestureRecognizer 捕捉滑动
触摸视图 -> touchesBegan(...) -> 有效
在视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效
触摸 B 视图 -> touchesBegan(...) -> 有效
在 B 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效
触摸 C 视图 -> touchesBegan(...) -> 不起作用
在 C 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 不起作用
我注意到我可以在 C 视图控制器中捕获触摸事件。
问题
是否有可能在 A 视图控制器 (UIViewController) 中捕获 swipe/touch 在 C 视图 (UICollectionView) 上产生的事件。
我的目标
我的目标是制作 SideBar 视图,当我尝试在 C 视图 (UICollectionView) 上捕捉屏幕边缘的滑动时,它只是在里面滚动,但我想在手指开始时打开 SideBar
覆盖函数:optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
在父 A View
& return 适当的 BOOL 中。
请记住,对于 userInteractionEnabled
属性设置为 true
的视图,该视图中的任何 touches/gestures 都不会传播到父视图(,除非 shouldReceive touch
被覆盖,以其他方式表示 )
我已将 UIGestureRecognizerDelegate
添加到 A View
viewController 的父 类。
class A_viewController: UIViewController,UIGestureRecognizerDelegate{...
我已将 UIScreenEdgePanGestureRecognizer
添加到 A view
- 父视图。
let rec = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handlePanGestRecognizer))
rec.edges = .left
rec.delegate = self
A_view.addGestureRecognizer(rec)
使用方法gestureRecognizerShouldBegin(...)
捕捉边缘滑动,并调用handlePanGestRecognizer(...)
方法产生动作。如果 gestureRecognizer
是 UIScreenEdgePanGestureRecognizer
则执行操作。
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
{
if gestureRecognizer is UIScreenEdgePanGestureRecognizer
{
handlePanGestRecognizer(recognizer: gestureRecognizer as! UIScreenEdgePanGestureRecognizer)
}
return false
}
除此之外 recognizer.state.rawvalue
= 0,所以当 handlePanGestRecognizer()
方法触发时 recognizer.state
不是 .begun
。
func handlePanGestRecognizer(recognizer : UIScreenEdgePanGestureRecognizer){...
如果您需要在每个 scrollView 上识别边缘滑动手势。 (UICollectionView 是一个 UIScrollView)
extension UIScrollView {
open override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
print("gesture recognizer should begin")
print(gestureRecognizer)
let app = UIApplication.shared.delegate as? AppDelegate
if let view = app?.window?.rootViewController?.view, !(gestureRecognizer is UIScreenEdgePanGestureRecognizer) {
let location = gestureRecognizer.location(in: view)
if location.x < view.frame.maxX * 0.05 || location.x > view.frame.maxX * 0.95 {
return false
}
}
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
}
大家好!
我有:
- 一个视图 - 是 UIViewController 的主视图
- B视图-是UIView和A视图的子视图(A_view.addsubview(B_view))
- C 视图 - 是 A 视图的 UICollectionView 和子视图 ...
什么问题?
我无法在父视图控制器中捕获触摸、滑动事件。
什么意思?
当我尝试使用 :
捕捉触摸事件时override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {...
在视图控制器中我可以看到这样的结果。
我尝试通过添加到 A_view
的 UIScreenEdgePanGestureRecognizer 捕捉滑动触摸视图 -> touchesBegan(...) -> 有效
在视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效
触摸 B 视图 -> touchesBegan(...) -> 有效
在 B 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 有效
触摸 C 视图 -> touchesBegan(...) -> 不起作用
在 C 视图上滑动 -> UIScreenEdgePanGestureRecognizer -> 不起作用
我注意到我可以在 C 视图控制器中捕获触摸事件。
问题
是否有可能在 A 视图控制器 (UIViewController) 中捕获 swipe/touch 在 C 视图 (UICollectionView) 上产生的事件。
我的目标
我的目标是制作 SideBar 视图,当我尝试在 C 视图 (UICollectionView) 上捕捉屏幕边缘的滑动时,它只是在里面滚动,但我想在手指开始时打开 SideBar
覆盖函数:optional func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
在父 A View
& return 适当的 BOOL 中。
请记住,对于 userInteractionEnabled
属性设置为 true
的视图,该视图中的任何 touches/gestures 都不会传播到父视图(,除非 shouldReceive touch
被覆盖,以其他方式表示 )
我已将
UIGestureRecognizerDelegate
添加到A View
viewController 的父 类。class A_viewController: UIViewController,UIGestureRecognizerDelegate{...
我已将
UIScreenEdgePanGestureRecognizer
添加到A view
- 父视图。let rec = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handlePanGestRecognizer)) rec.edges = .left rec.delegate = self A_view.addGestureRecognizer(rec)
使用方法
gestureRecognizerShouldBegin(...)
捕捉边缘滑动,并调用handlePanGestRecognizer(...)
方法产生动作。如果gestureRecognizer
是UIScreenEdgePanGestureRecognizer
则执行操作。func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { if gestureRecognizer is UIScreenEdgePanGestureRecognizer { handlePanGestRecognizer(recognizer: gestureRecognizer as! UIScreenEdgePanGestureRecognizer) } return false }
除此之外
recognizer.state.rawvalue
= 0,所以当handlePanGestRecognizer()
方法触发时recognizer.state
不是.begun
。func handlePanGestRecognizer(recognizer : UIScreenEdgePanGestureRecognizer){...
如果您需要在每个 scrollView 上识别边缘滑动手势。 (UICollectionView 是一个 UIScrollView)
extension UIScrollView {
open override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
print("gesture recognizer should begin")
print(gestureRecognizer)
let app = UIApplication.shared.delegate as? AppDelegate
if let view = app?.window?.rootViewController?.view, !(gestureRecognizer is UIScreenEdgePanGestureRecognizer) {
let location = gestureRecognizer.location(in: view)
if location.x < view.frame.maxX * 0.05 || location.x > view.frame.maxX * 0.95 {
return false
}
}
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
}