Как выполнить «панорамирование» (пролистывание) UITableView сверху вниз, используя UIPanGestureRecognizer, когда 1-я ячейка находится вверху UITableView? - PullRequest
1 голос
/ 15 июня 2019

Сценарий 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...