При использовании больших заголовков на панели навигации вместе с UITableView, привязанным к источнику данных драйвера Rx, я заметил, что если привязка и начальная загрузка данных происходят, когда представление находится за пределами экрана, при переходе к этому представлению оно будет прокручиваться. таким образом, что большой заголовок сжимается до «свернутого» положения.
Общая настройка представляет собой UITableViewController с набором prefersLargeTitles = true
. Tableview настроен и впоследствии привязан к источнику данных Rx в пределах viewDidLoad
.
Пример кода:
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
bindToTableView()
// ...
}
private func setupTableView() {
tableView.register(cellType: Cell.self)
tableView.tableFooterView = UIView()
tableView.separatorStyle = .none
// ...
// We are required to first reset the data source and delegate to allow
// for RxCocoa to take over control.
tableView.dataSource = nil
tableView.delegate = nil
tableView.rx.setDelegate(self)
.disposed(by: bag)
// ...
}
private func bindToModel() {
viewModel.modelDriver
.drive(tableView.rx.items) { tableView, row, model in
let indexPath = IndexPath(row: row, section: 0)
let cell: Cell = tableView.dequeueReusableCell(for: indexPath)
cell.prepare(with: model)
return cell
}.disposed(by: bag)
}
И под «сжатым» я подразумеваю, что заголовки переключаются на этот стиль:
Кто-нибудь еще сталкивался с этой проблемой?
Решено: как @daniel-t упоминает ниже, проблема вызвана не конкретно Rx, а временем, когда prefersLargeTitles = true
. Если это свойство не установлено до вызова tableView.reloadData()
, таблица будет загружаться в данные и соответствующим образом прокручиваться для небольших заголовков. Затем, после установки больших заголовков, представление таблицы не сбрасывает положение прокрутки, чтобы компенсировать новую, большую область панели навигации.
Причина, по которой это проявляется несколько странно, даже при использовании чего-то вроде .skipUntil(...viewWillAppear)
, заключается в том, что акт привязки запускает начальное обновление Rx, которое перезагружает представление таблицы.