как прокрутить 100 фотографий в UIScrollView в IPhone - PullRequest
1 голос
/ 11 мая 2010

Я пытаюсь прокрутить изображения, загружаемые из онлайн-альбома пользователя (как в приложении Facebook для iPhone), так как я не могу загрузить все изображения в память, я загружаю 3 изображения за раз (предыдущий, текущий и следующий). затем удаляем image (prev-1) & image (next +1) из подпредставлений uiscroller. моя логика отлично работает в симуляторе, но не работает в устройстве с этой ошибкой: [CALayer retain]: сообщение отправлено освобожденному экземпляру В чем может быть проблема ниже приведен пример кода

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView 
{
    pageControlIsChangingPage = NO;
    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    if (page>1 && page<=(pageControl.numberOfPages-3)) {
        [self removeThisView:(page-2)];
        [self removeThisView:(page+2)];
    }

    if (page>0) {
        NSLog(@"<< PREVIOUS");
        [self showPhoto:(page-1)];
    }

    [self showPhoto:page];
    if (page<(pageControl.numberOfPages-1)) {
        //NSLog(@"NEXT >>");
        [self showPhoto:page+1];
        NSLog(@"FINISHED LOADING NEXT >>");
    }
}

-(void) showPhoto:(NSInteger)index
{
    CGFloat cx = scrollView.frame.size.width*index;
    CGFloat cy = 40;

    CGRect rect=CGRectMake( 0, 0,320, 480);
    rect.origin.x =  cx;
    rect.origin.y = cy;
    AsyncImageView* asyncImage = [[AsyncImageView alloc] initWithFrame:rect];
    asyncImage.tag = 999;
    NSURL *url = [NSURL URLWithString:[pics objectAtIndex:index]];

    [asyncImage loadImageFromURL:url place:CGRectMake(150, 190, 30, 30) member:memberid isSlide:@"Yes" picId:[picsIds objectAtIndex:index]];

    [scrollView addSubview:asyncImage];
    [asyncImage release];
}

- (void) removeThisView:(NSInteger)index
{
    if (index<[[scrollView subviews] count] && [[scrollView subviews] objectAtIndex:index]!=nil) {
        if ([[[scrollView subviews] objectAtIndex:index] isKindOfClass:[AsyncImageView class]] || [[[scrollView subviews] objectAtIndex:index] isKindOfClass:[UIImageView class]]) {
            [[[scrollView subviews] objectAtIndex:index] removeFromSuperview];
        }
    }
}

Для записи это работает нормально в симуляторе, но не само устройство iphone. любые идеи будут оценены. веселит, Фреда.

1 Ответ

0 голосов
/ 29 марта 2011

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

Обратите внимание на тот факт, что классу никогда не следует сохранять свой делегат, для этих ситуаций идеально подходит свойство "assign".


Несколько советов:

  1. Вместо выделения / инициации и выпуска столько экземпляров во время прокрутки, попробуйте сохранить три класса ivars в своем классе и просто измените свойство frame для экземпляров во время прокрутки. Вы избежите большого количества выделений и выпусков, если пользователь прокручивает быстро, и это хорошо для iPhone.
  2. Избегайте прямого доступа к ивару, как это в вашем коде; Если использовать свойства, у них есть много преимуществ, помимо простой вещи «правильности» (одним из них является КВО).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...