UICollectionView显示错误的细胞滚动后 - 出队的问题?(UICollectionVi

2019-07-03 12:06发布

我有一个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; }

Answer 1:

我有similare问题。 因为重复使用的细胞不会重绘自己这是最有可能的。 在您的自定义单元格的内容类(你的PDF查看),触发帧是否更新重绘:

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

这为我工作。 此外,如果你的大小可能会改变,设置在自动屏蔽,使其填充有空间

self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

在初始化过程中。



Answer 2:

使用prepareForReuse法修正类似的问题

只是这种方法添加到您的自定义单元实现

- (void)prepareForReuse {

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

     // add remaining properties 

}


Answer 3:

我迅速固定的类似问题的基础上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() 。



文章来源: UICollectionView showing wrong cells after scrolling - dequeue issue?