滚动动画中的轻微停顿(iPad)

时间:2011-02-20 17:13:11

标签: objective-c ipad uiscrollview

我对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

2 个答案:

答案 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];
    ....