2014-02-25 33 views
15

我有一個簡單的UITableView與UITableViewCells。對於tableview中的第0行,我設置了單元格的背景顏色。現在點擊第0行我只想要擴展行。爲了達到這個目的,我使用了與here相同的技術來改變第0行的高度。爲什麼UITableViewCell會在更改高度時閃爍?

現在的問題是,單元展開和崩潰,但每個過程都有一個醜陋的單元格閃爍/閃爍。我已經嘗試過beginupdates/endupdates,並重新加載只是使用這一行單行[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];

什麼導致閃爍/閃爍點擊?我該如何擺脫它?是的,我忘了提及,我已將單元格的選擇風格設置爲無。所以這不會造成這種情況。

+0

這是閃爍也,如果你改變了UITableViewRowAnimation到例如UITableViewRowAnimationMiddle? – griz

+0

不會閃爍,但會呈現另一種動畫,就像我試圖插入新行一樣。 – Bourne

+0

你可以展示'didSelectRowAtIndex ...'和'cellForRowAtIndex ...'或其他任何相關創造你的細胞的代碼。 –

回答

0

我認爲在調用reloadData之前,不應該使用beginUpdate/endUpdates方法並手動執行動畫。數據源定義了細胞的最終狀態(動畫之後)。我希望這會幫助你。

+0

我不使用的BeginUpdate/endUpdate(儘管這也造成了問題,因爲我在這個問題提到過)。我正在使用reloadrowsat ...來重新加載該特定行。 – Bourne

+0

那我建議你申請簡單的動畫,可能是這將解決你的問題是這樣的:[UIView的animateWithDuration:1.0動畫:^ { [self.tableView setContentOffset:CGPointMake(0,newDistance)動畫:NO]; [self.tableView setRowHeight:newHeight]; }]; – Irfan

+1

或者我建議你可以用backgroundColor將背景視圖添加到你的UITableViewCell中。然後在您的tableView:didSelectRowAtIndexPath中:您可以使用UIView中的動畫API對隱藏或alpha進行動畫製作。當動畫完成時,您可以將隱藏動畫設置爲TRUE或將alpha恢復爲0以獲得閃光效果 – Irfan

-1

我期待閃光燈,因爲您選擇了沒有動畫,即UITableViewRowAnimationNone。嘗試淡入淡出的動畫。

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]]; 

如果仍然不好看,嘗試動畫所有可見行:

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade]]; 
+0

它仍然閃爍。無論動畫選擇如何,還是僅針對該行或可見行進行。 – Bourne

4

我也有過類似的問題,有幾個匪徒:

  • 製作確保你所有的tableview調用都在主線程中。
  • 檢查您的細胞高度邏輯,如果有不一致,可能會導致類似的問題。請記住,在要求表重新加載行之前,單元高度需要更新到最終高度。
  • 使用牢固的單元格背景色。如果單元格背景顏色不完全不透明,則iOS 7似乎有問題。使用非不透明的背景顏色時,(我不能同時使用非不透明的背景顏色找到解決這一點的同時,我懷疑它可能是在iOS 7的錯誤。)
+1

這是什麼意思? 在要求表重新加載行之前,請記住單元格高度需要更新爲最終高度。 – msfeldstein

+0

我想我的意思是,你需要確保您的代理設置來回報新HIGHT你調用[實現代碼如下beginUpdates]之前。 – psilencer

+0

從iOS 10開始,在添加或刪除行時,爲單元格使用不透明的背景色仍然會導致閃爍問題。 – phatmann

5

我有同樣的問題細胞。該解決方案是使用backgroundView財產,而不是backgroundColor

UIView *backgroundView = [[UIView alloc] initWithFrame:cell.frame]; 
backgroundView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.1f]; 
cell.backgroundView = backgroundView; 
cell.backgroundColor = [UIColor clearColor]; 
1

如果你不想動畫和閃爍停止電池,可以使用下面的解決方案 -

 [UIView setAnimationsEnabled:NO]; 
    [self.tableView beginUpdates]; 

    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
               withRowAnimation:UITableViewRowAnimationNone]; 
    [self.tableView endUpdates]; 
    [UIView setAnimationsEnabled:YES]; 

上面的代碼片段將在重新加載單元格時在單元格上沒有動畫

0

我不確定這是否與我今天上午面對的問題相同,但我的解決方案可能有助於某人...

在使用動畫重新加載期間,我的子視圖消失了... 它沒有mattter如果我用

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

[self.tableView reloadRowsAtIndexPaths:] 

最後我發現我修改單元格的子視圖框計算適當的大小......我改變它,開始使用其他視圖進行計算,並解決了我的問題。

相反的:

self.leftLabel.frame = CGRectMake(0, 0, innerWidth, CGFLOAT_MAX); 
[self.leftLabel sizeToFit]; 

我做的計算是這樣的:

UILabel * tmpLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, innerWidth, CGFLOAT_MAX)]; 
tmpLabel.numberOfLines = self.leftLabel.numberOfLines; 
tmpLabel.attributedText = self.leftLabel.attributedText; 
[tmpLabel sizeToFit]; 

self.leftLabel.frame = tmpLabel.frame;