在具有部分索引的UITableView上使用向右移动UIScreenEdgePanGestureRecognizer

时间:2017-07-25 16:27:30

标签: ios uitableview uigesturerecognizer

我想将UIScreenEdgePanGestureRecognizer添加到UITableView,以便我可以从右侧边缘滑动以转到控制器层次结构中的下一个屏幕。

这种方法很好,除非表视图的侧面显示了部分索引。在这种情况下,部分索引区域处理触摸,因此我无法从边缘滑动。我希望能够支持边缘平移和截面索引点击和垂直平移功能。

我尝试在UITableView顶部添加一个视图来处理滑动,但随后处理所有触摸并且表格视图不再有任何内容。

1 个答案:

答案 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中。而且您需要确保多次不添加手势识别器。