我在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; }
答案 0 :(得分:14)
我有类似的问题。这很可能是因为重用的单元格不会重绘。在自定义单元格的内容类(PDF视图)中,如果框架已更新,则触发重绘:
-(void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self setNeedsDisplay]; // force drawRect:
}
这对我有用。此外,如果您的单元格大小可能会更改,请设置自动调整遮罩,以便使用
填充空格self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
在初始化期间。
答案 1 :(得分:13)
修复了使用prepareForReuse方法的类似问题
只需将此方法添加到自定义单元格实现
即可- (void)prepareForReuse {
self.fileName = nil;
self.title = nil;
// add remaining properties
}
答案 2 :(得分:1)
我根据Asatur Galstyan的回答在swift中解决了类似的问题。
将自定义类与故事板中的单元格相关联后,可以覆盖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 recommends calling the the super.prepareForReuse() when overriding anyway。