0

UIImageView背景としてを持つカスタム セルを使用して、単純なコレクション ビューを作成しようとしています。次のようになります。

ここに画像の説明を入力

これは私のコードです:

ViewController.m


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.collectionView registerClass:[MyCell class] forCellWithReuseIdentifier:@"MY_CELL"];
    leftInset = rightInset = 0;
    numberOfDays = 31;

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 200;
}
- (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section
{
    return numberOfDays;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
{
    MyCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

    if(indexPath.row < 10)
    cell.imageView.image = [UIImage imageNamed:@"no"];
    else if(indexPath.section%3==1)
    {
        cell.imageView.image = [UIImage imageNamed:@"ok"];
    }
    else if(indexPath.section%3==2)
    {
        cell.imageView.image = [UIImage imageNamed:@"sa"];
    }
    else{
        cell.imageView.image = [UIImage imageNamed:@"happy_vote"];
    }
    return cell;
}

#pragma mark – UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    return CGSizeMake(CELL_DIM, CELL_DIM);
}

- (UIEdgeInsets)collectionView:
(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    // top left bottom right
    return UIEdgeInsetsMake(5, leftInset, 0, 0);
}

MyCell.m

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        NSLog(@"Init with frame!");
        self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, frame.size.width, frame.size.height)];

        [self.contentView addSubview:self.imageView];
        [self.imageView setBackgroundColor:[UIColor redColor]];
    }
    return self;
}

コレクション ビューの約 10 セクションで問題なく動作します。問題は、セクションを追加したいときに、垂直スクロールの動きが非常に遅くなることです。すべてのセルが一度に割り当てられていることに気付きました。これをよりリソースにやさしくし、スクロールが遅くて遅れるのではなく、継続的に移動する方法を探しています。この問題を回避するためにリソースの割り当てを処理する方法を教えてください。ありがとうございました。

PS:セルの背景から画像ビューを削除しようとしましたが、メソッドでcellForItemAtIndexPath:セルの背景色を設定しましたが、10以上のセクションの後、動きが非常に遅くなります。

4

1 に答える 1

0

実行時間を短縮するために実行したいことは、オブジェクトが既に開始されているかどうかを確認することです。毎回メモリから読み取る必要がないように、画像を個別にインスタンス化することもできます。

image1 をビュー コントローラのプロパティにします。

- (void)viewDidLoad
{
    image1 = [UIImage imageNamed:@"image1"];
    image2 = [UIImage imageNamed:@"image2"];
    image3 = [UIImage imageNamed:@"image3"];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath;
 {
     MyCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];

     if(indexPath.row < 10)
     cell.imageView.image = [UIImage imageNamed:@"no"];
     else if(indexPath.section%3==1)
     {
         cell.imageView.image = image1;
     }
     else if(indexPath.section%3==2)
     {
         cell.imageView.image = image2;
     }
     else{
         cell.imageView.image = image3;
     }
     return cell;
}
于 2014-05-09T06:09:18.463 に答える