Я не знаю лучшего решения, чем создание подкласса вашего tableView и блокирование его contentOffset
в layoutSubviews
его.Примерно так:
class MyTableView: UITableView {
var blocksOffsetAtZero = false
override func layoutSubviews() {
super.layoutSubviews()
guard blocksOffsetAtZero else { return }
contentOffset = .zero
}
}
Я думаю, что это решение, используемое в приложении Карты.Когда пользователь перетаскивает tableView на домашний экран, он не прокручивается, а поднимается до тех пор, пока не достигнет верхней части экрана, а затем снова прокручивается.
Для этого вы добавляете жест к вашему табличному виду, который распознает одновременно с распознавателем tableView и блокирует contentOffset
tableView каждый раз, когда распознаватель перемещает кадр tableView.
ОБНОВЛЕНИЕ https://github.com/gaetanzanella/mapLike
Правильно ли реализован делегат?
// MARK: - UIGestureRecognizerDelegate
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
Попробуйте что-то вроде:
@objc func tableViewDragged(gestureRecognizer: UIPanGestureRecognizer) {
if gestureRecognizer.state == UIGestureRecognizerState.began || gestureRecognizer.state == UIGestureRecognizerState.changed {
let translation = gestureRecognizer.translation(in: self.view)
var frame = self.tableView.frame
let nHeight = (frame.origin.y + translation.y)
if (nHeight < self.view.frame.size.height) {
frame.origin.y = nHeight
self.tableView.frame = frame
gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: self.view)
tableView.blocksOffsetAtZero = true
} else {
tableView.blocksOffsetAtZero = false
}
}
}
Основная идея: когда вы меняете кадр, блокируйте прокрутку.
Вы также можете использовать технику делегата, представленную kamaldeep singh bhatia, но вы не сможете переместить первый tableView, а затем прокрутить одним жестом.
См. Пример здесь