2017-02-23 75 views
-1

Когда я перенес мой быстрый код от 2,3 до 3,0 в Xcode8, я обнаружил, что UITableView с некоторой разной высотой ячеек сам изменит contentOffset после reloadData в iOS8. Но все было в порядке.UITableView изменит contentOffset в iOS8 с помощью swift3, это ошибка Swift3?

Я напечатал contentOffset в cellForRowAt: и scrollViewDidScroll: функция, как показано ниже:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    print("In scroll: \(scrollView.contentOffset)") 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    print("In cellForRow offset: \(tableView.contentOffset)") 

    //... 
} 

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

changed in swift3

В swift3, после reloadData, она будет меняться contentOffset сам по себе в iOS8.

no change in swift2.3

В swift2.3 без этой проблемы.

Весь мой тестовый проект загрузил мой репозиторий GitHub, вы можете проверить или git clone от https://github.com/heqichang/swift3-tableview-issue и запустить мой код в телефоне с iOS8.

Является ли это ошибкой swift3?

shake in iOS8

UPDATE

Я просто проверить свой код в iPhone5s с iOS8.4 и iPhone6p с iOS10.0.2.

+0

Вы только что напишите в «ячейке» cellForRowAt indexPath => cell.selectionStyle = .none – iParesh

+0

Вы можете отключить функцию отказов, возможно, это помогает. – Anuraj

+0

@iParesh Извините, моя ошибка. Я не уточнил свою проблему. Я имею в виду, что tableview будет изменять смещение контента после reloadData вызова. –

ответ

0

Вы можете отключить стиль выбора ячейки в cellForRowAt indexPath: IndexPath этим кодом:

cell.selectionStyle = .none 

или в раскадровке на инспектора:

enter image description here

+0

Извините, моя ошибка. Я не уточнил свою проблему.Я имею в виду, что tableview будет изменять смещение контента после reloadData вызова. –

0

Я вижу то же самое : UITableView теперь может изменить свой contentOffset во время процессов UITableView.reloadData() и layout(). Следовательно, код, такие как:

someTableView.reloadData() 
someTableView.setContentOffset(CGPoint(x: xPos, y: yPos), animated: false) 

не гарантирует, что таблица будет компенсирована в xPos, yPos после перезагрузки. (Я считаю, что это ошибка, Apple.)

Один из способов, который работает для меня, чтобы заставить таблицу макет перед установкой contentOffset:

someTableView.reloadData() 
someTableView.layoutIfNeeded() 
someTableView.setContentOffset(CGPoint(x: xPos, y: yPos), animated: false) 

Как спрашивающего, я тоже вижу это в таблицу с ячейками переменной высоты, поэтому это может быть фактором.

+0

Я нашел swift3 в iOS8 пропустит последнюю строку в heightForRowAt: после вызова reloadData. Я переключил раздел и строку, чтобы решить мою проблему. –

+0

@ QichangHe - Что вы имеете в виду: «Я переключил раздел и ряд, чтобы решить мою проблему?» Звучит интересно! –

+0

вернуть 1 в numberOfRowsInSection, вернуть номер ячейки в numberOfSections. –