UIRfreshControl: табличное представление странно прыгает

У меня есть UIRefreshControl внутри табличного представления, и моя проблема в том, что когда я опускаю В табличном представлении есть определенный момент, когда изменение размера элемента управления обновлением не анимируется, а резко перескакивает с одного размера на другой.

Я воссоздал поведение на простом примере, это весь код, который у меня есть в моем View Controller:

class ViewController: UIViewController {
    
    let refreshControl = UIRefreshControl()
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        
        refreshControl.backgroundColor = .blue
        tableView.refreshControl = refreshControl
        tableView.insertSubview(refreshControl, at: 0)
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "testCell", for: indexPath)
        cell.textLabel?.text = "\(indexPath.row)"
        return cell
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        refreshControl.endRefreshing()
    }
}

На следующем видео видно, что анимация изменения размера плавная, за исключением определенного момента, когда он начинает прыгать: введите здесь описание изображения


person chnski    schedule 30.11.2020    source источник
comment
Не могли бы вы попробовать удалить эту строку, пожалуйста: tableView.insertSubview(refreshControl, at: 0)? tableView.refreshControl = refreshControl уже должен добавить refreshControl в качестве подпредставления, поэтому похоже, что вы выполняете избыточную работу, а также пытаетесь жестко закодировать порядок подпредставлений вместо того, чтобы полагаться на встроенное поведение.   -  person Legonaftik    schedule 01.12.2020
comment
Привет, спасибо за ваше предложение. К сожалению, после удаления этой строки поведение такое же.   -  person chnski    schedule 01.12.2020


Ответы (1)


Вы можете сделать это быстро, например:

var refreshControl = UIRefreshControl()

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.delegate = self
  tableView.dataSource = self

  refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
  refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
  tableView.addSubview(refreshControl) // not required when using UITableViewController
}

@objc func refresh(_ sender: AnyObject) {
   // Code to refresh table view  
   refreshControl.endRefreshing() // End Refreshing
}

Вы не можете endRefreshing() в методе scrollViewDidEndDecelerating и обновить свой viewDidLoad(), как указано выше.

person Virani Vivek    schedule 01.12.2020
comment
Спасибо, но это не работает. Неважно, где я вызываю endRefreshing(), потому что, если вы посмотрите видео в моем вопросе, переход произойдет, пока элемент управления все еще обновляется, и я вытягиваю представление таблицы. - person chnski; 01.12.2020
comment
Смотрите мой обновленный ответ и попробуйте. - person Virani Vivek; 01.12.2020
comment
Спасибо, удаление следующей строки: tableView.refreshControl = refreshControl и добавление ее только в качестве подпредставления действительно помогло! Интересно, почему это так, поскольку в большинстве руководств и онлайн-ресурсов предлагаемый подход делает и то, и другое. - person chnski; 01.12.2020