私は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;
}