17

我在 UIViewController 中有一个 UICollectionView。在 collectionView cellForItemAtIndexPath: 方法中,它根据数据源创建一系列自定义单元格。自定义单元格又包含一个 UIView,子类化以绘制单个 PDF 页面。

它的设置方式是将 PDF 文件拆分为单个页面,因此单元格 1 包含 PDF 第 1 页,单元格 2 包含 PDF 第 2 页,依此类推。到目前为止一切顺利,这是我的问题:

当我向下滚动时, UICollectionView 开始显示错误的单元格。例如,在一个 34 页的文档中,它以正确的顺序显示单元格/第 1-16 页,但随后开始显示似乎已进一步出列的页面,例如单元格 1、单元格 2、单元格 4。我从来没有到达任何地方靠近单元格/第 34 页。

我过去曾在 UITableView 中看到过类似的行为,并且认为这与单元格的出列或委托方法有关。不太确定 - 任何帮助表示赞赏。

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

//create custom cell
CustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath];

//set file name (always the same; one PDF file)
cell.fileName = fileName;
cell.backgroundColor = [UIColor clearColor];

//set the title to the page number
cell.title = [NSString stringWithFormat:@"page %@", [countArray objectAtIndex:indexPath.row]];

//set the current page (which indicates which page to display) according to the pageCount
cell.currentPage = [[countArray objectAtIndex:indexPath.row] intValue];

return cell; }
4

3 回答 3

15

我有类似的问题。这很可能是因为重用的单元格不会自己重绘。在您的自定义单元格的内容类(您的 PDF 视图)中,如果框架更新,则触发重绘:

-(void)setFrame:(CGRect)frame {
    [super setFrame:frame];
    [self setNeedsDisplay]; // force drawRect:
}

这对我有用。此外,如果您的单元格大小可能会发生变化,请设置自动调整大小掩码,使其填充空间

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

在初始化期间。

于 2012-11-20T08:47:25.327 回答
13

使用 prepareForReuse 方法修复了类似问题

只需将此方法添加到您的自定义单元实现中

- (void)prepareForReuse {

     self.fileName = nil;
     self.title = nil;

     // add remaining properties 

}
于 2014-06-19T10:45:17.140 回答
1

我根据 Asatur Galstyan 的回答迅速解决了一个类似的问题。

将自定义类关联到情节提要中的单元格后,可以覆盖 prepareForReuse() 函数:

import UIKit

class SomeCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var exampleView: UIView!
    @IBOutlet weak var exampleLabel: UILabel!

    override func prepareForReuse(){
        super.prepareForReuse()
        exampleLabel.textColor = nil
        exampleView.backgroundColor = nil
        exampleView.layer.cornerRadius = 0
    }
}

prepareForReuse() 的默认实现什么都不做(至少在 iOS 10 中),但Apple 建议在覆盖时调用 super.prepareForReuse()

于 2017-08-31T12:20:36.723 回答