ScrollView с большими изображениями прокручивается слишком медленно

#iphone #uiscrollview

#iPhone #uiscrollview

Вопрос:

Когда я часто прокручиваю изображения в UIScrollView, то после нескольких изображений загрузка следующего изображения занимает время … это не занимает слишком много времени, но выглядит странно.

Предположим, у меня есть 27 изображений в ScrollView. Когда я начинаю прокручивать эти изображения, для 1 или 2 изображений прокручивается плавно, но когда я прокручиваю снова, чтобы увидеть третье изображение, для загрузки требуется время. Затем, когда я снова начинаю прокручивать изображения с 3-го изображения, оно ведет себя так же, как и раньше.

Я не могу загрузить все 27 изображений одновременно или мое приложение вылетает.

Когда я медленно прокручиваю scrollview, у меня нет этой проблемы.

Мой код ниже:

 //Taking image view for 27 images;   

int x=0;   
for(int i = 1; i<=27; i  ) {                
    imageView = [[UIImageView alloc] init];
    imageView .frame = CGRectMake(x,0,768,1024);
    imageView.tag=i;
    imageView.image=nil;
    imageView.userInteractionEnabled=YES;
    [contentView addSubview:imageView];
    x =768;     
}

//setContentOffset of the scrollView -->ContentView

[contentView setContentOffset: CGPointMake((imageNumber-1)*768, 0) animated: YES];

//desire image which i want to see from the start of the scrollview
pageNumber=imageNumber;


int pageBefore=pageNumber-1;
int pageAfter=pageNumber 1;

//Views for image 

for( UIImageView * views in [contentView subviews]){
    if(views.tag==pageNumber){
        if(views.image==nil){
            NSLog(@"entering");
            views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageNumber]];
        [views.image release];
        }
    }

    if(views.tag==pageBefore){
        if(views.image==nil){
            views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageBefore]];
        [views.image release];
        }
    }

    if(views.tag==pageAfter){
        if(views.image==nil){
            views.image=[UIImage imageNamed:[ NSString stringWithFormat:@"%d.jpg",pageAfter]];
        [views.image release];
        }
    }
  

Ответ №1:

Мои тревожные звоночки зазвенели, когда я увидел это;

 imageView .frame = CGRectMake(x,0,768,1024);
  

Если не считать пробела перед .frame, вы хотите сказать, что ваши изображения имеют размер 768×1024? Это ОГРОМНО, и я подозреваю, что ваши проблемы связаны с памятью, а не с кодом.

Имейте в виду, что, в частности, использование UIImage imageNamed: может вызвать проблемы с такими большими изображениями, поскольку этот метод кэширует изображения в памяти. Возможно, вы захотите рассмотреть возможность использования альтернативных методов, которые каждый раз загружают изображение из файла.

Комментарии:

1. Спасибо, Роджер, за ваш ответ. С точки зрения вашего звонка будильника, я скажу, что уже говорил, что я новичок в разработке приложений для iphone. Теперь, если объяснить это вкратце, это будет полезно для меня. Может быть, я отнимаю у вас время, но вы знаете, что делиться и заботиться. заранее спасибо.

2. Стоит прочитать здесь, поскольку в нем есть несколько примеров кода и он объясняет проблему немного подробнее. alexcurylo.com/blog/2009/01/13/imagenamed-is-evil

Ответ №2:

Вам следует попробовать использовать EGOImageView, в нем встроено кэширование, которое может помочь с вашими проблемами производительности. Вы можете реализовать изображение-заполнитель, чтобы показать пользователю, что изображение готовится к просмотру. Изображение загрузится в другом потоке перед отображением, что обеспечивает более плавную прокрутку. EGOImageView является частью библиотеки EGOImageLoading.

https://github.com/tastefulworks/EGOImageLoading

В качестве альтернативы вы могли бы создать свой собственный механизм отложенной загрузки, чтобы повысить производительность прокрутки. Например. как только пользователь на секунду прекратит прокрутку, начните загружать изображение, в противном случае отобразите изображение-заполнитель, если еще не кэшировано правильное изображение.

Редактировать: размышляя больше об этой проблеме, я понимаю, что кэширование не сильно поможет (поскольку вы уже загружаете изображение с диска), но асинхронная загрузка изображений должна повысить производительность прокрутки, поэтому используйте NSThread или NSOperation для загрузки изображения в фоновый поток, затем уведомите основной поток о том, что изображение загружено и готово к отображению.

Комментарии:

1. Привет, Вольфганг Шройрс, спасибо за ваше драгоценное время. но если вы объясните это вкратце, то это будет полезно для меня.