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

Mac Catalyst - Adding Click + Drag gesture to UITableView/UIScrollView

我正在为一个自由职业项目启用 Catalyst 支持 — 我立即注意到的一件事是 MacOS 与 iOS 上滚动视图的不同行为。我希望能够像在 iOS 模拟器中一样单击并拖动 UIScrollViews 或 UITableViews,但我只能使用鼠标滚轮滚动这些视图(或触控板上的两个手指手势)。

有什么方法可以在 MacOS 上使用单击 + 拖动手势来模仿 iOS 上 UIScrollViewUITableViewUIPanGestureRecognizer 行为?

谢谢:)

我注意到 UICollectionViews 也一样。我决定使用滚动按钮并让它们设置选择和偏移量。您可以对每个单元格中的 UIGestureRecognizers 执行相同的操作,然后设置父 UITableView 或 UICollectionView 的偏移量等。我没有想过简单的 UIScrollViews。

以下方法可以解决问题:

首先是一个方便的扩展:

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

如果 Private API 可以接受,Mac Catalyst 14.0 中有一个新的就是这样做的:

- [UIScrollView _setSupportsPointerDragScrolling:]

值得注意的是,从 Monterey 开始,如果您在触控板上使用双指手势,那么它的工作方式就像在设备上滚动一样——包括弹跳。