Сценарий 1: у меня есть UITableView
без заголовка внизу просмотра, с полным отображением первой ячейки и прокрутка UITableView
отключена. Мне нужно сдвинуть вверх (проведите пальцем вверх) UITableView
к вершине представления с увеличением высоты, и когда UITableView
достигнет вершины представления, заголовок таблицы должен отображаться с анимацией, и должна быть включена прокрутка.
Сценарий 2: UITableView
необходимо сдвинуть (провести вниз) до исходного состояния с отключенной прокруткой и без заголовка, как это было в начальной позиции. Скольжение должно происходить только в том случае, если первая ячейка находится сверху UITableView
.
Решение сценария 1: я добавил UIPanGestureRecognizer
к UITabeView
и панорамировал (прокрутил) UITableView в верхней части представления. После этого я включил table scrolling
и перезагрузил данные таблицы. По высоте для заголовка в разделе я возвращаю высоту заголовка, только если прокрутка включена.
Сценарий 2 - проверенное решение: после того, как таблица достигла вершины, я удалил UIPanGestureRecognizer
из UITableView
и добавил его в заголовок таблицы. Когда я перетаскиваю заголовок, таблица просмотра опускается в исходное положение и прокрутка отключается. Но мне нужно, чтобы прокрутка происходила в самом UITableView
, только если первая ячейка находится сверху UITableView
.
@IBOutlet public var headerView !
@IBOutlet public var tableView !
var intialTableFrame : CGRect!
// setting panGesture for table
override func viewDidLoad() {
panGesture = UIPanGestureRecognizer(target: self,
action: #selector("handlePanGesture:"))
tableView.addGestureRecognizer(panGesture )
tableView.isScrollEnabled = false
}
// panGesture
@objc func handlePanGesture(sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: self.tableView)
// let velocity = sender.velocity(in: self.tableView)
let oldFrame = self.tableView.frame
if sender.state == UIGestureRecognizer.State.changed {
self.tableView.frame.origin.y = oldFrame.origin.y + translation.y
self.tableView.frame.size.height = oldFrame.size.height - translation.y
sender.setTranslation(CGPointZero, inView: self.tableView)
}
else if sender.state == UIGestureRecognizer.State.ended {
if self.tableView.frame.origin.y < self.view.center.y {
UIView.animate(withDuration:0.3, animations: { () -> Void in
self.tableView.frame.origin.y = 0
self.tableView.frame.size.height = self.view.frame.size.height
})
self.tableView.isScrollEnabled = true
self.tableView.reloadData() // This will add headerView to the table
self.tableView.removeGestureRecognizer(panGesture)
self.headerView.addGestureRecognizer(panGesture )
}
else {
UIView.animate(withDuration:0.3, animations: { () -> Void in
self.tableView.frame = self.intialTableFrame
})
self.tableView.isScrollEnabled = false
self.tableView.reloadData() // This will remove headerView to the table
self.headerView.removeGestureRecognizer(panGesture)
self.tableView.addGestureRecognizer(panGesture )
}
}
}
Expected Results : When i swipe the UITableView from top to bottom, the table should panned down only if the 1st cell is at the top of the UITableView. Otherwise the table should scroll as normal with the same position