2012-11-13 110 views
50

發生了什麼事UICollectionView的細胞消失

目前,我有使用兩個UICollectionViews一個UITableView中的應用程序。這樣我創建了一個類似於應用程序的Pulse News外觀。我的問題是,有時第6行和第11行完全消失,留下應該是單元格的空白空間。如果所有的單元格都是這樣的(這樣我就可以認爲我沒有正確地做事),但我不會介意,但事情是,正好發生在那些特定的單元格上。

我的理論

第6和第11行是那些當我開始滾動所以在默認情況下,我能看到5個細胞出現,當我做的第一水平滾動第六屆上來(有時候是空白)。

我有什麼

我目前做的唯一事情是這樣的:

[self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER]; 

viewDidLoad。而在創作細胞:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]; 

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]]; 

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController]; 

    return cell; 
} 

所以我低估沒有什麼特別的事情在這裏。我雖然在數據源(一個虛擬的JSON文件)上出現了問題,但有時它工作正常,單元格顯示,所以我認爲從該部分可以確定。

所以我的「問題」:有誰知道發生了什麼事?我真的不想說這是來自iOS的一個bug,但我想不出別的。


編輯1.0

驚人的一部分,該方法

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath; 

是不計算[0打算從indexPath [0,4]到[0,6], 5]。我第一次在iOS中看到這種情況。


編輯2.0

我轉,我創建了細胞的方式,而不是離隊我現在用的是老辦法:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil]; 
MyCell *cell = (MyCell *)[nib objectAtIndex:0]; 

還是同樣傷心的結果。

+0

我得到同樣的問題,但消失的單元最終呈現在以前的單元格下面!很奇怪。我認爲這是iOS中的一個錯誤。 –

+0

奇怪的事情正在發生。 = /但仍然是一個優秀的控制器.. – Peres

+0

我有使用集合視圖創建的經典網格視圖。我有3個細胞連續,有小間隙。同樣的事情發生在這裏,但似乎非常隨機。不時有一個細胞被放置在連續的第四個地方,並且在預期的地方沒有任何東西。 –

回答

33

那麼,什麼工作?

1)子類UICollectionViewFlowLayout

2)將我的UICollectionView的flowLayout設置爲我的新子類。

3)在UICollectionViewFlowLayout子類的init方法,設置你想要的方向:

self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

在我的情況下,它是水平的。

4)重要組成部分

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 

在這個時刻,我應該理論化一點,但說實話我沒有線索。

+3

看看這個bug:http://openradar.appspot.com/12433891難道是你遇到的? –

+0

我必須誠實Rob,在使用'UICollectionView'時發生奇怪的事情,不確定它是否相關。 – Peres

+1

您是否嘗試過調整單元格寬度和高度?我在水平滾動收藏視圖中遇到同樣的渲染問題。當我的單元格寬度爲70,高度爲70時,我得到消失的單元格。如果我將單元格寬度保持爲70,並將單元格高度更改爲69,則它會正確渲染。我可以每次重現這種情況。 –

3

羅布的有關錯誤尖幫我。該錯誤指出,如果節插入和單元格的寬度和間距恰好與屏幕寬度相加,那麼第一列有時會隨機消失,並在某些地方重新出現某些單元格。我沒有細分或改變單元格寬度,而是將故事板中的左側和右側的部分插圖從6更改爲4,並且我沒有再次看到問題。

+1

我無法使用Rob的解決方案修復它。但我真的很高興它爲你工作。 – Peres

11

以上的答案並沒有爲我工作,但下載圖像後,我更換了代碼 [self.myCollectionView reloadData][self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; 刷新的CollectionView,它顯示的所有單元格,你可以試試。

+3

哇,這實際上工作... –

+0

愚蠢的是,這也適用於我...以及'UICollectionView'怎麼回事? – LucasTizma

+0

試過上面的其他解決方案,沒有人工作(Swift 3),這個修復了這個bug。奇怪... – Antoine

4

任何人給出的解決方案中沒有幫助我,我們需要在我們的應用程序我的自定義佈局。 相反,我不得不這樣做:(而且是啊,IT WORKS !!!)

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ 
    CGSize size = [self collectionViewContentSize]; 
    rect.size.height = size.height*2; 
    NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect]; 
    return atrributes_Super; 
} 

畢竟,UICollectionView只是尋找一個元素的屬性顯示在屏幕的矩形。

+0

類似的事情發生在這裏。 我的layoutAttributesForElementsInRect實現沒有返回所需單元格的屬性,而該屬性又被設置爲.hidden = YES。 – jcardenete

1

在我的情況(垂直滾動,與細胞第一視圖消失),將細胞由於不正確的估計大小消失。看起來,UICollectionView使用估計大小來計算要在第一個視圖中加載的項目。我會將估計的尺寸設置得太高,導致第一個屏幕中要加載的項目數量計算錯誤。

我做出了預測的高度有點低的那一刻,所有的細胞正確顯示。

0

對我來說,這個問題似乎與我讓我的CollectionView適應開放式鍵盤,以防止內容重疊的方式有關。

在我的觀察,以應對KeyboardWillShow我有這個:

var userInfo = obj.UserInfo[UIKeyboard.FrameEndUserInfoKey]; 
if (userInfo is NSValue value) 
{ 
    var rect = value.CGRectValue; 
    var windowOffset = this.Superview.ConvertPointToView(this.Frame.Location, UIApplication.SharedApplication.KeyWindow); 
    var newHeight = rect.Y - windowOffset.Y; 

    this._controller.CollectionView.Frame = new CGRect(0, 0, this._controller.CollectionView.Frame.Width, newHeight); 
} 

將其更改爲在此之後:

var userInfo = obj.UserInfo[UIKeyboard.FrameBeginUserInfoKey]; 
if (userInfo is NSValue value) 
{ 
    var rect = value.CGRectValue; 
    UIEdgeInsets contentInsets = new UIEdgeInsets(0, 0, rect.Height, 0); 
    this._controller.CollectionView.ContentInset = contentInsets; 
    this._controller.CollectionView.ScrollIndicatorInsets = contentInsets; 
} 

細胞消失的問題完全走了。這是C#與Xamarin合作,但我希望它可以幫助別人。

0

我認爲這不是一個UICollectionView的錯誤,也許你不能在- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect方法中返回正確的數據。

你可以看到這個演示:https://github.com/lqcjdx/YLTagsChooser,scolling的UICollectionView當所有的細胞可以出現。

0

我們最近遇到消失的單元,發現我們不小心插入了0x0大小的單元而不是跳過'隱藏'單元。由此產生的行爲是非常混亂,並沒有暗示這些看不見的細胞是問題。我們會看到正確大小的單元格和佈局,但有些有效單元格在屏幕上滾動/關閉後會一直消失。我不知道爲什麼混合0大小的單元格會導致這種行爲,但刪除它們可以解決問題。這可能不會導致您的問題,但這可能有助於開發人員搜索類似的症狀。