1

UIImageViewsでiCarouselを使用するのに問題はなく、すべてがうまく機能します。

ただし、画像に描画を追加したかったので、画像を含み、カスタム描画ルーチンを備えたUIViewの簡単なサブクラスを作成しました。十分に単純です。ただし、viewForItemAtIndex内で、imageプロパティを設定すると、視覚的に更新されません。代わりに、表示されている画像、つまり最初に読み込まれたオブジェクトを表すn個の画像を繰り返します。

たとえば、26枚の画像a--zがあります。5起動時に表示されます、a-e。'setNeedsReload'がないと、ビューをスクロールすると、-zではなくa-eの画像が繰り返し表示されます。

setImageプロパティ内に' setNeedsDisplay 'を追加すると、正しく機能することがわかりました。ただし、パフォーマンスが大幅に低下します。

私の質問は2つあります:

  1. 私は何かが足りないのですか?
  2. 代わりにUIImageViewを拡張して、NickがFXImageで行ったように、「processImage」スタイルのメソッド内でカスタム描画を行う必要がありますか?

ありがとう、

/// GroupImageView.m

- (void)setImage:(UIImage *)newImage {
    image = newImage;
    [self setNeedsDisplay];
}

// override of the drawRect routine.
- (void)drawRect:(CGRect)rect {

    //  only draw if we have an image to draw
    if (image) {
        CGContextRef context = UIGraphicsGetCurrentContext();

        // blah blah, fancy drawing crap
        CGContextRotateCTM (context, radians((rand() % 5 + 2)));
        CGContextTranslateCTM(context, -0.5f * insetRect.size.width, -0.5f * insetRect.size.height);
        CGContextFillRect(context,insetRect);
        // etc

        [image drawInRect:insetRect blendMode:kCGBlendModeNormal alpha:[self alpha]];

        // etc
    } 
}

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {

    if (view == nil) {
        view = [[GroupImageView alloc] initWithImage:[UIImage imageNamed:@"Loading.png"]];
    }
    CGImageRef ref = [group posterImage];
    UIImage* coverImage;
    if (ref) {
        coverImage = [UIImage imageWithCGImage:ref scale:1/scaleFactor orientation:UIImageOrientationUp];
    }
    else {
        coverImage = [UIImage imageNamed:@"Sunflower.png"];
    }

    [(GroupImageView*)view setImage:coverImage];
    return view;

}
4

1 に答える 1

2

drawRectは描画にCoreGraphicsを使用し、Core Graphicsはハードウェアアクセラレーションされていないため、UIImageViewは画像の描画にdrawRectを使用しません。

drawRectを使用してコンテンツを描画するUIViewサブクラスは、UIImageViewよりも100倍遅くなります。そのため、パフォーマンスの問題が発生します。

FXImageViewは、バックグラウンドスレッドで描画を実行し、NSOperationQueueを使用して、必要に応じて画像が順番に更新されるようにすることで、これを回避します。

FXImageViewをフォークし、プロセスイメージメソッドを変更して描画を行うことは悪い考えではありません。FXImageViewのキューイングとキャッシュの動作を最初から再作成するよりも確かに作業が少なくなります。FXImageViewのキャッシュは、使用する特定の描画属性に基づいているため、キャッシュキーロジックも変更する必要があることに注意してください。

FXImageViewを更新して、カスタムの描画ブロックプロパティを含めることを検討するかもしれません。これは便利なことのようです。

于 2012-07-13T09:24:28.937 に答える