当第一个单元格位于UITableView的顶部时,如何使用UIPanGestureRecognizer从顶部到底部“平移”(滑动)UITableView?

时间:2019-06-14 21:07:21

标签: ios swift uitableview uipangesturerecognizer

场景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

0 个答案:

没有答案