2013-05-21 43 views
0

我在UICollectionViewCell中遇到了UIScrollView的奇怪行爲。在我的項目中,我有一個collectionView,每個單元格都有一個包含1個或多個圖像的UIScrollView。下面是這個問題的目的,一些示例代碼:在我的項目UICollectionViewCell和UIScrollView

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; 
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)]; 
    imageView.image = [UIImage imageNamed:@"someImage.png"];   
    [cell.scrollView addSubview:imageView]; 

    return cell; 
} 

當然這是不一樣的形象,而且正在從數據庫中飼餵不同的。

添加第一個收集單元沒有問題。當我添加第二個單元格時,scrollView似乎會自我複製,並將其自身的另一個實例放置在頂部。我知道這聽起來有些不可思議,但你可以看到它的外觀如下圖所示:

enter image description here

請注意,在滾動視圖圖像左側是如何變黑了,我想這是因爲滾動視圖得到複製。

所以,我猜測單元格是以錯誤的方式或其他方式重用的。

感謝您的幫助!

回答

0

每次調用collectionView: cellForItemAtIndexPath:時,新的UIImageView正被添加到重用單元中。要解決此問題,請在自定義UICollectionViewCell中實施prepareForReuse方法。在該方法中,刪除圖像視圖。

要做到這一點,您可以在圖像視圖上設置標籤。例如,:

(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; 
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)]; 
    imageView.image = [UIImage imageNamed:@"someImage.png"];   
    [cell.scrollView addSubview:imageView]; 

    // The following line of code is new 
    cell.contentView.tag = 100; 

    return cell; 
} 

,並從細胞中刪除圖像查看,添加/更新的自定義單元格的prepareForReuse方法:

-(void)prepareForReuse{ 
    UIView *myImageView = [self.contentView viewWithTag:100]; 
    [myImageView removeFromSuperview]; 
} 
+0

好吧,這個問題的是固定部分,它不重複,但現在我注意到另一個奇怪的問題。如果我通過在一個單元格的scrollViews中滑動來更改內容偏移量,則內容偏移量將傳遞到下一個單元格,並且前一個可能會獲得新內容偏移量(即x = 0,y = 0)。 –

+0

這有點難以解釋,因爲我不太明白這種行爲的原因,對不起:) –

+0

據我所知,每次添加新單元格時,整個collectionView都會更新。當單元格添加了scrollView時,會導致非常奇怪的結果。我在想,只有新的單元格被修改,但我看到所有單元格都被重用了 –