Сохранение положения ячеек в TableView

tableview

#1

День добрый,
Есть TableView и я хотел сделать сохранение позиций ячеек
Пример: в TableView всего 30 ячеек, Прокрутил я допустим на 14 ячейку и закрыл программу и после запускаем заново программу и позиция ячеек сохранилась

Пытался сделать

let index = self.userDefalts.object(forKey: "position") as! Int
// index записывается в методе cellForRowAt indexPath
let indexPath = IndexPath(row: index, section: 0)
tableView.scrollToRow(at: indexPath, at: .bottom, animated: true)

но прокрутка меня такая не устраивает - хочется чтобы как закрыл так и открыл, а сейчас нижняя ячейка делает сдвиг


#2

Сохраняйте в таком случае не индекс ячейки, а ее верхнюю Y координату. После запуска приложения прокручивайте уже по Y оси. Но это будет работать в том случае, если у вас высота ячеек останется не изменной.
Если совсем заморочиться, то я могу предположить, что можно сохранять 2 числа - индекс ячейки и ее отступ от верхнего края ScrollView, вроде это можно получить. В таком случае делаете прокрутку по индексу и после выравниваете по сохраненному отступу. В таком случае высота ячеек уже роли не сыграет.


#3

Супер) а теперь еще вопрос:
Как узнать Y?


#4

Это уже нужно искать. Я не помню. Там у tableView есть куча методов, в том числе позиция ячейки по Y от верхнего края таблицы. Что-то должно быть связанное с offset.


#5

Вот решение

let keyOffset = "Position"

В методе

 func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {    
   //Сохраняйте положение таблицы.
let defaults = UserDefaults.standard
defaults.set(tableView.contentOffset.y, forKey: UserDefaultsKeys. keyOffset)
defaults.synchronize()

}

А в методе

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)   
// Загружаем offset
if defaults.object(forKey: UserDefaultsKeys. keyOffset) != nil {
    let offsetY = defaults.object(forKey: UserDefaultsKeys. keyOffset) as! CGFloat
    tableView.setContentOffset(CGPoint(x: 0, y: offsetY), animated: false)

}