我对iPad上的编程比较陌生,我试图整理一个简单的程序。基本上,它是一本儿童书,我需要漫画风格(或照片)查看器的功能,人们可以通过这种功能轻扫以更改“页面”(或图像)。
每张图片为1024x768。目前,它们存储为JPG,因为PNG似乎产生了非常大的文件大小。对于这个故事,有28页。
我看了一下PageControl示例,实现了一个UIScrollView。在初始化时,我创建了一个足够大的scrollview区域。然后当用户滚动时,我加载上一个和下一个图像。再次,就像示例一样,只是没有在底部实现页面控件。
我遇到的问题是当我翻转时动画中的一个非常小的暂停。一旦加载或缓存图像,就不会发生这种情况。现在,我知道照片应用程序没有这样做,我不确定是什么导致它。
这是我的scrollViewDidScroll方法的代码。我跟上页码,它只会在页面发生变化时调用loadPageIntoScrollView - 我认为它正在制作的疯狂号码导致动画中的轻微停顿,但结果并非如此。
- (void) scrollViewDidScroll: (UIScrollView *) sender
{
CGFloat pageWidth = scrollView.frame.size.width;
int localPage = floor( (scrollView.contentOffset.x - pageWidth / 2 ) / pageWidth ) + 1;
if( localPage != currentPage )
{
currentPage = localPage;
[self loadPageIntoScrollView:localPage - 1];
[self loadPageIntoScrollView:localPage];
[self loadPageIntoScrollView:localPage + 1];
}
} // scrollViewDidScroll
这是我的loadPageIntoScrollView
方法。我只是在创建一个UIImageView并将图像加载到其中 - 我不知道它是多么“精简”。但不知何故,它导致暂停。同样,它不是一个巨大的停顿,只是你注意到的那些事情之一,并且足以使滚动看起来像它有一个非常。非常轻微的打嗝。
提前感谢您提供的任何帮助。
- (void) loadPageIntoScrollView: (int)page
{
if( page < 0 || page >= kNumberOfPages )
return;
UIImageView *controller = [pages objectAtIndex:page];
NSLog( @"checking pages" );
if( (NSNull *)controller == [NSNull null] )
{
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
NSString *pageName = [[NSString alloc] initWithFormat:@"%d.jpg", page];
controller = [[UIImageView alloc]initWithImage:[UIImage imageNamed:pageName]];
[controller setUserInteractionEnabled:YES];
[controller addGestureRecognizer:singleTap];
[pages replaceObjectAtIndex:page withObject:controller];
[controller release];
} // if controller == null
// add the page to the scrollview
if( controller.superview == nil )
{
NSLog(@"superview was nil, adding page %d", page );
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.frame = frame;
[scrollView addSubview:controller];
} // if
} // loadPageIntoScrollView
答案 0 :(得分:1)
因为你说加载图像后不再滞后,我怀疑它是磁盘访问导致你的延迟,但你应该通过仪器运行你的应用程序以试图排除cpu-spikes评估文件系统使用情况。您可以尝试将图像预加载到您所处的任何图像的左侧和右侧,以便用户不会感觉到滞后。
答案 1 :(得分:0)
首先,你应该可以使用PNG就好了。我已经构建了几个与你在这里做的完全相同的应用程序,你可以在内存中安装3个1024 x 768 PNG而不会耗尽(但你不能做更多)。您还应该使用PNG,因为它们是iOS的首选格式,因为它们在构建期间将应用程序捆绑在一起时进行了优化。
在此行中加载图像会导致轻微延迟:
controller = [[UIImageView alloc]initWithImage:[UIImage imageNamed:pageName]];
我通常做的是使用以下内容在单独的线程中加载图像:
[self performSelectorInBackground:@selector(loadPageIntoScrollView:) withObject:[NSNumber numberWithInt:localPage]];
请注意,您需要将localPage
整数放入NSNumber
对象中以便传递它,因此请不要忘记更改loadPageIntoScrollView:
方法:
- (void) loadPageIntoScrollView: (NSNumber *)pageNumber
{
int page = [pageNumber intValue];
....