2017-02-23 44 views
-1

當我在Xcode8中將我的swift代碼從2.3遷移到3.0時,發現UITableView具有一些不同高度的單元格會在iOS8中的reloadData之後自行更改contentOffset。但swift2.3中的一切都很好。和scrollViewDidScroll:UITableView將更改iOS8中的contentOffset與swift3,這是一個Swift3錯誤?

我在cellForRowAt印刷contentOffset功能象下面這樣:與不同版本的迅速

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後,它將在iOS8上改變contentOffset本身。

no change in swift2.3

在swift2.3,如果沒有這個問題。

我的整個測試項目上傳了我的GitHub倉庫,您可以從https://github.com/heqichang/swift3-tableview-issue中檢查或git克隆,然後使用iOS8在您的手機中運行我的代碼。

這是swift3的bug嗎?

shake in iOS8

UPDATE

我只是測試我的iPhone5s與iOS8.4和iPhone6p與iOS10.0.2代碼。這段代碼IndexPath:

cell.selectionStyle = .none 

或情節串連圖板在檢查:

enter image description here

+0

你剛纔在cellFor的cell中寫了cellForRowAt indexPath => cell.selectionStyle = .none – iParesh

+0

你可以關閉反彈功能可能會有幫助。 – Anuraj

+0

@iParesh對不起,我的錯。我沒有澄清我的問題。我的意思是在調用reloadData之後tableview會改變內容偏移量。 –

回答

0

可以在cellForRowAt禁用單元選擇風格 indexPath :UITableView現在可能會在UITableView.reloadData()layout()過程中更改它的contentOffset。因此,這樣的代碼:

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

不保證該表將在xPosyPos重裝後所抵消。 (我認爲這是一個錯誤,蘋果)

一個解決辦法是的工作對我來說是給力表設置contentOffset之前佈局:

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

一樣提問,我也是在看到這個表可變高度單元格,這可能是一個因素。

+0

對不起,我的錯。我沒有澄清我的問題。我的意思是在調用reloadData之後tableview會改變內容偏移量。 –

0

我看到同樣的事情

+0

我發現iOS8中的swift3會錯過heightForRowAt中的最後一行:在調用reloadData之後。我切換部分和行來解決我的問題。 –

+0

@QichangHe - 你是什麼意思,「我換了部分和行來解決我的問題?」聽起來不錯! –

+0

返回numberOfRowsInSection中的1,返回numberOfSections中的單元格編號。 –