2

私はiPad アプリにNick Lockwood のiCarouselを使用しています。現在は、15 個の全画面画像のカルーセルにすぎません。

シングル ビュー プロジェクトをセットアップし、ストーリーボードに iCarousel ビューを追加し、そのビュー コントローラーをデータ ソースとして追加し、データソース メソッドに次のコードを配置します。

- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel {
    return 15;
}

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
    UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg", index]];
    UIImageView* imgView = [[UIImageView alloc] initWithImage:img];

    return imgView;
}

これは機能しますが、最初にすべてのアイテムをスクロールすると、新しいアイテムがカルーセルに追加されるときにパフォーマンスが少し低下することに気付くでしょう。これは、すべての項目を 2 回目に行ったときには発生しません。

このプロファイラーのスクリーンショットで、私が言いたいことを理解できます。前半のピークは、初めてすべての画像をスクロールしたときのもので、もう一度スクロールしてもピークはなく、パフォーマンス ヒットもありません。

どうすればこれを修正できますか?

ここに画像の説明を入力

編集

計測器のピークの 1 つを分離しました。これがコール ツリーです。

ここに画像の説明を入力

編集

jcesar 提案のコード

- (void)viewDidLoad {
    [super viewDidLoad];

    NSMutableArray* urls_aux = [[NSMutableArray alloc] init];
    for (int i = 0; i<15; i++) {
        NSString *urlPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"captura%d", i] ofType:@"jpg"];
        NSURL *url = [NSURL fileURLWithPath:urlPath];

        [urls_aux addObject:url];
    }
    self.urls = urls_aux.copy;

    self.carousel.dataSource = self;
    self.carousel.type = iCarouselTypeLinear;
}

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

    if (view == nil) {
        view = [[[AsyncImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)] autorelease];
        view.contentMode = UIViewContentModeScaleAspectFit;
    }

    [[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:view];
    ((AsyncImageView *)view).imageURL = [self.urls objectAtIndex:index];

    return view;
}
4

3 に答える 3

0

彼の例を見てください: Dynamic Downloads。彼はAsyncImageView代わりUIImageViewに、画像を非同期でロードする を使用しています。そのため、15 個の画像すべてを同時にロードしようとすることはありません。パフォーマンスの問題は発生しないはずです。

于 2013-04-05T10:36:37.187 に答える