我想将UIScreenEdgePanGestureRecognizer添加到UITableView,以便我可以从右侧边缘滑动以转到控制器层次结构中的下一个屏幕。
这种方法很好,除非表视图的侧面显示了部分索引。在这种情况下,部分索引区域处理触摸,因此我无法从边缘滑动。我希望能够支持边缘平移和截面索引点击和垂直平移功能。
我尝试在UITableView顶部添加一个视图来处理滑动,但随后处理所有触摸并且表格视图不再有任何内容。
答案 0 :(得分:0)
好的,所以我尝试了很多东西,想出了一个非理想但有效的解决方案。
问题的第一部分是节索引在它自己的视图中作为UITableView的子视图。因此,它会捕获您可能添加到UITableView的任何触摸或手势识别器。
第二个问题是节索引视图不是公共API的一部分。
所以我的解决方案是在部分索引视图中添加UIScreenEdgePanGestureRecognizer。
视图是私有类UITableViewIndex的一个实例。为了得到它,我创建了一个UITableView扩展:
extension UITableView {
var sectionIndexView: UIView? {
for view in self.subviews {
if view.className() == "UITableViewIndex" {
return view
}
}
return nil
}
}
注意以上代码是脆弱的,不是将来的证据,因为如果Apple更改了视图层次结构中的类名称或其位置,它将不再起作用。在我的情况下,边缘滑动是一个方便的功能,并有一个"下一个"屏幕顶部的按钮。此外,我的大多数视图控制器都没有表索引,所以如果它停止工作,它只会在几个屏幕上。因此,如果这个解决方案未来不起作用,那么这不是一件大事。
我还编写了一个便利函数来从任何视图中获取边缘手势识别器:
extension UIView {
var screenEdgePanGestureRecognizer: UIScreenEdgePanGestureRecognizer? {
guard let gestures = self.gestureRecognizers else {
return nil
}
for gesture in gestures {
if let edgePan = gesture as? UIScreenEdgePanGestureRecognizer {
return edgePan
}
}
return nil
}
}
我在视图控制器的UIScreenEdgePanGestureRecognizer
方法中向UITableView
添加viewDidLoad
。
最后,在我的视图控制器的viewDidAppear
中,我检查手势识别器是否已添加到部分索引视图中。如果它还没有,那我就把它添加到那里。在将部分索引添加到表视图后,您需要在某个时刻执行此操作 - 即不在viewDidLoad
中。而且您需要确保多次不添加手势识别器。