0

UICollectionViewCell 内で UIScrollView の奇妙な動作に遭遇しました。私のプロジェクトには collectionView があり、各セルには 1 つ以上の画像を含む 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;
}

もちろん、私のプロジェクトでは、データベースから供給されたのは同じ画像ではなく、異なる画像です。

最初の収集セルは問題なく追加されます。2 番目のセルを追加すると、scrollView はそれ自体を複製し、その上に別のインスタンスを配置するように見えます。奇妙に聞こえるかもしれませんが、下の画像でどのように見えるかを確認できます。

ここに画像の説明を入力

左側の scrollView の画像がどのように暗くなったかに注目してください。これは、scrollView が複製されたためだと思います。

だから、セルが間違った方法で再利用されていると推測しています。

ご協力いただきありがとうございます!

4

1 に答える 1

0

が呼び出されるUIImageViewたびに、再利用されたセルに新しいセルが追加されます。collectionView: cellForItemAtIndexPath:これを解決するには、カスタム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];
}
于 2013-05-21T13:50:26.027 に答える