Mac Catalyst - 向UITableView/UIScrollView添加点击+拖动手势

5
我正在为一个自由项目启用Catalyst支持。其中一件事情是我立刻发现了MacOS和iOS上滚动视图的不同行为。我原本期望能够像在iOS模拟器中一样点击和拖动UIScrollView或UITableView,但我只能使用鼠标滚轮(或者在触控板上用两个手指手势)来滚动这些视图。
有没有办法在MacOS上使用点击+拖动手势来模仿iOS上UIScrollView或UITableView的UIPanGestureRecognizer行为?
谢谢 :)

如何在Swift中为TableView设置setSupportsPointerDragScrolling? - Fattie
4个回答

3
如果接受私有API,那么在Mac Catalyst 14.0中有一个全新的API可以完美实现此功能。
- [UIScrollView _setSupportsPointerDragScrolling:]

1
以下是解决方法:
首先是方便的扩展:
public extension CGPoint {
    static func - (a: CGPoint, b: CGPoint) -> CGPoint {
        return CGPoint(x: a.x-b.x, y: a.y-b.y)
    }
}

在滚动视图中添加一个平移手势:
scrollView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(onPan(_:))))

最后是选择器:
private var s0: CGPoint = .zero
@objc func onPan(_ gesture: UIPanGestureRecognizer) {
    let ds: CGPoint = gesture.translation(in: scrollView)
    switch gesture.state {
        case .began:
            s0 = scrollView.contentOffset
        case .changed:
            scrollView.contentOffset = CGPoint(x: 0, y: max(0, min(scrollView.contentSize.height-scrollView.height, (s0-ds).y)))
        default: break
    }
}

这里包含了完整的CGPoint便捷方法:https://github.com/aepryus/Acheron


很不幸,如果你只是增加一个简单的 pan 操作,它并不真正起作用——你可以将表格移动到任何超出常规最大值的不切实际的位置,而且根本没有抛出异常。 - Fattie
@Fattie 我本来以为我的应用程序可以正常工作,实际上也确实如此,但是当我查看代码时,我注意到我手动添加了约束条件。我已经添加了上面的约束条件。但是,你是对的,使用这种方法没有惯性组件。 - aepryus

1
我注意到UICollectionView也是同样的情况。我决定使用滚动按钮并设置它们的选择和偏移量。您可以在每个单元格中使用UIGestureRecognizers做同样的事情,然后设置父级UITableView或UICollectionView的偏移量等。我没有考虑简单的UIScrollViews。

0
值得注意的是,从 Monterey 开始,如果您在触摸板上使用两个手指手势,则它会像在设备上滚动一样正常工作,包括弹跳效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接