Mac Catalyst - добавление жеста щелчка + перетаскивания в UITableView / UIScrollView

Я сейчас включаю поддержку Catalyst для проекта-фрилансера - одна из вещей, которые я сразу заметил, - это различное поведение прокрутки представлений в MacOS и iOS. Я ожидал, что смогу щелкнуть и перетащить UIScrollViews или UITableViews, как обычно в симуляторе iOS, но я могу прокручивать эти представления только с помощью колеса прокрутки мыши (или жеста двумя пальцами на трекпаде).

Есть ли способ имитировать UIPanGestureRecognizer поведение на iOS для UIScrollView или UITableView с помощью жеста «Щелкнуть + перетащить» на MacOS?

Спасибо :)


person chmod    schedule 14.11.2020    source источник


Ответы (3)


Я заметил то же самое для UICollectionViews. Я решил использовать кнопки прокрутки и настроить выделение и смещения. Вы можете сделать то же самое с UIGestureRecognizers в каждой ячейке, а затем установить смещения и т. Д. Родительского UITableView или UICollectionView. Я не думал о простых UIScrollViews.

person polymerchm    schedule 15.11.2020

Следующее поможет:

Сначала удобное расширение:

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 = s0-ds
        default: break
    }
}

(Полный набор удобных методов CGPoint включен здесь: https://github.com/aepryus/Acheron)

person aepryus    schedule 21.03.2021

Если Private API приемлем, в Mac Catalyst 14.0 есть новый, который делает именно это:

- [UIScrollView _setSupportsPointerDragScrolling:]
person naituw    schedule 30.05.2021