UITableView - scroll to the top

前端 未结 30 2757
南方客
南方客 2020-11-28 17:22

In my table view I have to scroll to the top. But I cannot guarantee that the first object is going to be section 0, row 0. May be that my table view will start from section

相关标签:
30条回答
  • 2020-11-28 17:55

    Swift 5, iOS 13

    I know this question already has a lot of answers but from my experience, there is only one method that always works:

    tableView.scrollToRow(at: IndexPath(row: someArray.count - 1, section: 0), at: .bottom, animated: true)

    If you're working in async, tables that animate with keyboards, etc., the other answers will often scroll to the almost bottom, not the absolute bottom. This method will get you to the absolute end of a table every time.

    0 讨论(0)
  • 2020-11-28 17:56

    Possible Actions:

    1

    func scrollToFirstRow() {
        let indexPath = NSIndexPath(forRow: 0, inSection: 0)
        self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
    }
    

    2

    func scrollToLastRow() {
        let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0)
        self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true)
    }
    

    3

    func scrollToSelectedRow() {
        let selectedRows = self.tableView.indexPathsForSelectedRows
        if let selectedRow = selectedRows?[0] as? NSIndexPath {
            self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true)
        }
    }
    

    4

    func scrollToHeader() {
        self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true)
    }
    

    5

    func scrollToTop(){
        self.tableView.setContentOffset(CGPointMake(0,  UIApplication.sharedApplication().statusBarFrame.height ), animated: true)
    }
    

    Disable Scroll To Top:

    func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) {
        for subview in view.subviews {
            if let scrollView = subview as? UIScrollView {
                (scrollView as UIScrollView).scrollsToTop = false
            }
            self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView)
        }
    }
    

    Modify and use it as per requirement.

    Swift 4

      func scrollToFirstRow() {
        let indexPath = IndexPath(row: 0, section: 0)
        self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
      }
    
    0 讨论(0)
  • 2020-11-28 17:56

    On iOS 11, use adjustedContentInset to correctly scroll to top for both cases when the in-call status bar is visible or not.

    if (@available(iOS 11.0, *)) {
        [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES];
    } else {
        [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES];
    }
    

    Swift:

    if #available(iOS 11.0, *) {
        tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true)
    } else {
        tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
    }
    
    0 讨论(0)
  • 2020-11-28 17:57

    For tables that have a contentInset, setting the content offset to CGPointZero will not work. It'll scroll to the content top vs. scrolling to the table top.

    Taking content inset into account produces this instead:

    [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];
    
    0 讨论(0)
  • 2020-11-28 17:57

    I prefer the following, as it takes into account an inset. If there is no inset, it will still scroll to the top as the inset will be 0.

    tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)
    
    0 讨论(0)
  • 2020-11-28 17:59
    func scrollToTop() {
            NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0];
            [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }
    

    call this function wherever you want UITableView scroll to top

    0 讨论(0)
提交回复
热议问题