Mac Catalyst - 添加点击 + 拖动手势到 UITableView/UIScrollView
Mac Catalyst - Adding Click + Drag gesture to UITableView/UIScrollView
我正在为一个自由职业项目启用 Catalyst 支持 — 我立即注意到的一件事是 MacOS 与 iOS 上滚动视图的不同行为。我希望能够像在 iOS 模拟器中一样单击并拖动 UIScrollView
s 或 UITableView
s,但我只能使用鼠标滚轮滚动这些视图(或触控板上的两个手指手势)。
有什么方法可以在 MacOS 上使用单击 + 拖动手势来模仿 iOS 上 UIScrollView
或 UITableView
的 UIPanGestureRecognizer
行为?
谢谢:)
我注意到 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 开始,如果您在触控板上使用双指手势,那么它的工作方式就像在设备上滚动一样——包括弹跳。
我正在为一个自由职业项目启用 Catalyst 支持 — 我立即注意到的一件事是 MacOS 与 iOS 上滚动视图的不同行为。我希望能够像在 iOS 模拟器中一样单击并拖动 UIScrollView
s 或 UITableView
s,但我只能使用鼠标滚轮滚动这些视图(或触控板上的两个手指手势)。
有什么方法可以在 MacOS 上使用单击 + 拖动手势来模仿 iOS 上 UIScrollView
或 UITableView
的 UIPanGestureRecognizer
行为?
谢谢:)
我注意到 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 开始,如果您在触控板上使用双指手势,那么它的工作方式就像在设备上滚动一样——包括弹跳。