2014-02-18 5 views
0

Библиотеки, такие как SDWebImage и AFNetworking, добавляют возможность установить image на UIImageView на основе URL-адреса, который загружается асинхронно, что не позволяет пользователю ждать, пока загружается изображение.Как работать в рамках UIImageView при использовании асинхронной библиотеки загрузки, такой как SDWebImage или UIImageView + AFNetworking?

Для моего использования, я создаю галерею, похожую на Photos.app, но изображения загружаются из URL-адресов. В случае, если галерея говорит, 50 изображений с высоким разрешением я не хочу, чтобы пользователь должен был ждать, пока каждый из них загрузится, прежде чем они смогут просматривать даже первые, поэтому эти библиотеки идеально подходят для моего использования (я загружу первое изображение затем загружается по требованию).

Однако я смущен тем, как показывать изображения в представлении, когда их кадр еще не известен, поскольку изображение еще не загружено. Это было бы проблемой без проблем, если бы каждый из них имел один и тот же фрейм (если они были аватарами, например), но это не так.

В моем случае, я использую UIImageViews следующим образом:

// Create image view 
self.imageView = [[UIImageView alloc] initWithImage:image]; 
self.imageView.userInteractionEnabled = YES; 

// Create scroll view 
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; 
self.scrollView.delegate = self; 
self.scrollView.contentSize = self.imageView.bounds.size; 
self.scrollView.showsHorizontalScrollIndicator = NO; 
self.scrollView.showsVerticalScrollIndicator = NO; 
self.scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

// Figure out the zoom extremities, as well as the initial zoom level so full image is visible 
CGFloat scrollViewWidthRatio = CGRectGetWidth(self.scrollView.bounds)/self.scrollView.contentSize.width; 
CGFloat scrollViewHeightRatio = CGRectGetHeight(self.scrollView.bounds)/self.scrollView.contentSize.height; 
CGFloat minScale = MIN(scrollViewWidthRatio, scrollViewHeightRatio); 
self.scrollView.minimumZoomScale = minScale; 
self.scrollView.zoomScale = minScale; 
self.scrollView.maximumZoomScale = 1.0; 

// Add image view and scroll view 
[self.scrollView addSubview:self.imageView]; 
[self.view addSubview:self.scrollView]; 

Однако все это, кажется, ломаются, когда нагрузка изображения асинхронно. Каким образом я устанавливаю фрейм, поскольку изображение может быть любого миллиона разных размеров? Что я установил scrollView.contentSize по той же проблеме? Как рассчитать масштаб масштабирования scrollView?

В принципе, как использовать концепцию рамки или размер, когда я еще не знаю? Есть ли способ обновить все это, когда изображение загружено?

ответ

0

Relayout scrollПросмотреть все подзадачи будет стоить много. Эффект, который вы хотите, должен зависеть от данных с Сервера, из которых вы можете получить размер изображения, прежде чем у вас будет downlaoded. Есть много стилей, для двух основных метода:

  1. Deal с URL: http://xxx.xx.xx.pic_200 * 150, 200 * 150 размер изображения
  2. возврата сервера добавить данные о размере. {@ "width": 200, @ "height": 150}

Используйте размер, вы можете разметка scrollView с изображением по умолчанию, затем загружать асинхронно и обновлять изображение при завершении загрузки.

Надежда может вам помочь!

+0

К сожалению, у меня нет контроля над сервером. –

Смежные вопросы