Небольшая пауза в прокрутке анимации (iPad) - PullRequest
0 голосов
/ 20 февраля 2011

Я относительно новичок в программировании на iPad, и я пытался собрать простую программу. По сути, это книга для детей, и мне нужна функциональность средства просмотра стилей комиксов (или фотографий), где люди проводят пальцем, чтобы изменить «страницы» (или изображения).

Каждое изображение 1024x768. В настоящее время они хранятся в формате JPG из-за очень больших размеров файлов, которые, как представляется, создают PNG. Для этой истории есть 28 страниц.

Я взглянул на пример PageControl, реализующий UIScrollView. При инициализации я создаю достаточно большую область прокрутки. Затем, когда пользователь прокручивает, я загружаю предыдущее и следующее изображения. Опять же, как в примере, только без реализации элемента управления страницы внизу.

Проблема, с которой я сталкиваюсь, - это небольшая пауза в анимации, когда я переворачиваюсь. Как только изображения загружены или кэшированы, этого не происходит. Теперь я знаю, что приложение для работы с фотографиями этого не делает, и я не уверен, что его вызывает.

Вот мой код для метода 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 ]

1 голос
/ 21 февраля 2011

Поскольку вы говорите, что после загрузки изображения оно больше не запаздывает, я подозреваю, что задержка вызывает доступ к диску, но вы должны запустить свое приложение с помощью инструментов, чтобы попытаться исключить также спайки процессора как оценить использование файловой системы. Вы можете попытаться предварительно загрузить изображения влево и вправо от любого изображения, на котором вы находитесь, чтобы пользователь не чувствовал такой большой задержки.

0 голосов
/ 21 февраля 2011

Во-первых, вы должны быть в состоянии использовать 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];
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...