iOS TableView reload and scroll top

后端 未结 6 532
隐瞒了意图╮
隐瞒了意图╮ 2020-12-03 07:50

the second day I can not solve the problem with the table.

We have a segmentedControl which, when changed, changes the table. Suppose that there are 3 elements in th

相关标签:
6条回答
  • 2020-12-03 08:05

    Perfectly to the top of page on reload, by twice reloading

    No disturbing animation

    dataForSource = nil
    tableView.reloadData()
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
        self.dataForSource = realData
        self.tableView.reloadData()
    }
    
    0 讨论(0)
  • 2020-12-03 08:06

    UItableView method scrollToRow(at:at:animated:) Scrolls through the table view until a row identified by index path is at a particular location on the screen.

    Use

    tableView.scroll(to: .top, animated: true)
    

    You can use my extension

    extension UITableView {
    
        public func reloadData(_ completion: @escaping ()->()) {
            UIView.animate(withDuration: 0, animations: {
                self.reloadData()
            }, completion:{ _ in
                completion()
            })
        }
    
        func scroll(to: scrollsTo, animated: Bool) {
            DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(300)) {
                let numberOfSections = self.numberOfSections
                let numberOfRows = self.numberOfRows(inSection: numberOfSections-1)
                switch to{
                case .top:
                    if numberOfRows > 0 {
                         let indexPath = IndexPath(row: 0, section: 0)
                         self.scrollToRow(at: indexPath, at: .top, animated: animated)
                    }
                    break
                case .bottom:
                    if numberOfRows > 0 {
                        let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1))
                        self.scrollToRow(at: indexPath, at: .bottom, animated: animated)
                    }
                    break
                }
            }
        }
    
        enum scrollsTo {
            case top,bottom
        }
    }
    
    0 讨论(0)
  • 2020-12-03 08:07

    Okay. So people finding issue with scrolling a tableview to the top with

    self.tableView.setContentOffset(.zero, animated: false)
    

    And need to do reload data unnecessarily to fix this !

    So What is the issue with setContentOffset is kind of bug of iOS ?
    The smallest and simplest answer is NO so what's the issue then ?

    The answer is that dynamic row is using UITableView.automaticDimension. Tableview calculates its content offset with row height and with the number or sections and rows you have in your data source. So in case of dynamic height is not performing the scrollToTop correctly, it is because it needs to recalculate every row height and content size.

    So to reduce this bundle from tableview we, can provide an estimated row height like

    self.tableView.estimatedRowHeight = 117 // whatever your value 
    

    Hopefully this will help someone :)

    0 讨论(0)
  • 2020-12-03 08:12

    I found better way to do this. It works like a charm.

    let topIndex = IndexPath(row: 0, section: 0)
    tableView.scrollToRow(at: topIndex, at: .top, animated: true)
    
    0 讨论(0)
  • 2020-12-03 08:12

    you can use this.

        tableView.setContentOffset(CGPoint.zero, animated: true)
    

    you can set animated as your requirement

    0 讨论(0)
  • 2020-12-03 08:21

    I was getting the following error after trying to scroll to top straight after calling a reloadData

    [UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (0) beyond bounds (0) for section (0).'
    

    This fixed it for me:

        tableView.reloadData()
        if tableView.numberOfRows(inSection: 0) != 0 {
            tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)
        }
    
    0 讨论(0)
提交回复
热议问题