17

UIViewController内にUICollectionViewがあります。collectionView cellForItemAtIndexPath:メソッドでは、データソースに基づいて一連のカスタムセルを作成します。カスタムセルには、単一のPDFページを描画するためにサブクラス化されたUIViewが含まれています。

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では)何もしませんが、とにかくオーバーライドするときは、super.prepareForReuse()を呼び出すことをお勧めします

于 2017-08-31T12:20:36.723 に答える