我正在使用 Nick Lockwood 的 iCarousel对于 iPad 应用程序。现在它只是 15 张全屏图片的轮播。
我设置了一个单 View 项目,在 Storyboard中添加 iCarousel View ,将其 View Controller 添加为数据源,并将此代码用于数据源方法:
- (NSUInteger)numberOfItemsInCarouseliCarousel *)carousel {
return 15;
}
- (UIView *)carouseliCarousel *)carousel viewForItemAtIndexNSUInteger)index reusingViewUIView *)view {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat"image%d.jpg", index]];
UIImageView* imgView = [[UIImageView alloc] initWithImage:img];
return imgView;
}
这可行,但是当我第一次滚动浏览所有项目时,您会注意到在将新项目添加到轮播时性能会受到一点影响。我第二次检查所有项目时不会发生这种情况。
您可以在此分析器屏幕截图中看到我的意思。前半部分的峰值是我第一次滚动浏览所有图像,然后我再次滚动,没有峰值,也没有性能损失。
我该如何解决这个问题?
编辑
我隔离了仪器上的一个峰,这是调用树
编辑
带有 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 *)carouseliCarousel *)carousel viewForItemAtIndexNSUInteger)index reusingViewUIView *)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;
}
Best Answer-推荐答案 strong>
我不认为这是一个非常正统的解决方案,但它确实有效。
我所做的是使用 iCarousel 的方法 insertItemAtIndex:animated: 在设置时一次添加一个图像。然后性能受到打击,但之后一切顺利。
- (void)viewDidLoad
{
[super viewDidLoad];
self.images = [[NSMutableArray alloc] init];
self.carousel.dataSource = self;
self.carousel.type = iCarouselTypeLinear;
for (int i = 0; i<15; i++) {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat"captura%d.jpg", i]];
[self.images addObject:img];
[self.carousel insertItemAtIndex:i animated:NO];
}
}
- (NSUInteger)numberOfItemsInCarouseliCarousel *)carousel {
return self.images.count;
}
- (UIView *)carouseliCarousel *)carousel viewForItemAtIndexNSUInteger)index reusingView:(UIView *)view {
UIImage* img = [self.images objectAtIndex:index];
UIImageView* imgView = [[UIImageView alloc] initWithImage:img];
return imgView;
}
关于ios - iPad 上的 iCarousel 性能问题,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/15831148/
|