Ios iCarousel在iPad上的性能问题
我在用Nick Lockwood的iPad应用程序。现在它只是一个由15幅全屏图像组成的旋转木马 我设置了一个单视图项目,在故事板中添加了iCarousel视图,将其视图控制器添加为数据源,并将以下代码用于数据源方法:Ios iCarousel在iPad上的性能问题,ios,objective-c,icarousel,Ios,Objective C,Icarousel,我在用Nick Lockwood的iPad应用程序。现在它只是一个由15幅全屏图像组成的旋转木马 我设置了一个单视图项目,在故事板中添加了iCarousel视图,将其视图控制器添加为数据源,并将以下代码用于数据源方法: - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel { return 15; } - (UIView *)carousel:(iCarousel *)carousel viewForItemAtInde
- (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;
}
这是可行的,但当我第一次滚动浏览所有项目时,您会注意到在向旋转木马添加新项目时,性能受到了一些影响。这不会发生在我第二次检查所有项目时
你可以在这个分析器屏幕截图中看到我的意思。上半部分的峰值是我第一次滚动所有图像,然后我再次滚动,没有峰值,也没有性能影响
我怎样才能解决这个问题
编辑
我在仪器上分离出一个峰值,这是呼叫树
编辑
带有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;
}
-(void)viewDidLoad{
[超级视图下载];
NSMutableArray*URL_aux=[[NSMutableArray alloc]init];
对于(int i=0;i很难确定,但我猜第一次是从文件中加载图像;而第二次是使用缓存副本-这是+[UIImage imagename:]
会自动为您加载图像;如果没有它,您每次都会看到性能下降。您可以提前在应用程序代理或控制器的初始化器中加载图像
您可以做的另一件事是利用iCarousel的视图重用逻辑。我认为这不是您的问题的原因,但您最好现在就做:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg", index]];
UIImageView* imgView = nil;
if ([view isKindOfClass:[UIImageView class]])
{
imgView = (UIImageView *)view;
imgView.image = img;
[imgView sizeToFit];
}
else
{
[[UIImageView alloc] initWithImage:img];
}
return imgView;
}
更新:如果你能获得更多关于你的应用程序在哪里花费时间的信息,那就太好了。如果你使用,你可以得到每种方法花费时间百分比的明细。看看他的例子:。他使用AsyncImageView
而不是UIImageView
,以异步方式加载图像。因此它不会尝试要同时加载所有15个图像,我认为它不应该有性能问题我认为这不是一个非常传统的解决方案,但它是有效的
我所做的是使用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)numberOfItemsInCarousel:(iCarousel *)carousel {
return self.images.count;
}
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
UIImage* img = [self.images objectAtIndex:index];
UIImageView* imgView = [[UIImageView alloc] initWithImage:img];
return imgView;
}
-(void)viewDidLoad
{
[超级视图下载];
self.images=[[NSMutableArray alloc]init];
self.carousel.dataSource=self;
self.carousel.type=iCarouselTypeLinear;
对于(int i=0;i可能异步加载图像,他有一些这样加载图像的示例。你能解释你的答案吗?是的,看看他的示例:。他使用异步ImageView而不是UIImageView,它以异步方式加载图像。因此它不会尝试同时加载所有15个图像,我认为使用sti不会有性能问题ll不会更改任何内容。我尝试将所有图像加载到NSArray(甚至所有UIImageView)但它仍然是一样的。重用现在不会改变任何事情,但这是一个明智的做法。有趣的是,阵列解决方案不起作用。你有没有在仪器中查看你的应用程序在哪里花费时间?我为其中一个峰值添加了调用树。我尝试复制该代码。没有任何变化。我认为问题在于icarousel sett第一次启动映像,而不是在我从磁盘加载映像时启动。看起来很好,没有任何线索。如果您使用全屏映像和线性模式,您是否考虑过UICollectionView?或PSTCollectionView(替代iOS>=4.3)顺便说一句,我想我已经解决了这个问题……(谢天谢地,我想我没有德雷克斯勒的计划,我想这是国际奥委会的协议)