Как галерея three20 загружает изображения?

#php #iphone #ios #gallery #three20

#php #iPhone #iOS #Галерея #three20

Вопрос:

На моем сервере у меня есть три файла на изображение.

  • Файл миниатюр, который обрезается до 128 на 128.
  • Небольшой файл, размер которого, по моему мнению, должен быть не более 160 на 240.
  • Большой файл, размер которого, по моему мнению, должен быть не более 960 на 540.

Мой метод возврата этих URL-адресов в галерею three20 выглядит следующим образом:

 - (NSString*)URLForVersion:(TTPhotoVersion)version {
    switch (version) {
        case TTPhotoVersionLarge:
            return _urlLarge;
        case TTPhotoVersionMedium:
            return _urlSmall;
        case TTPhotoVersionSmall:
            return _urlSmall;
        case TTPhotoVersionThumbnail:
            return _urlThumb;
        default:
            return nil;
    }
}
  

После входа в систему при вызове этих различных значений происходит следующее:

  1. При загрузке страницы эскизов вызываются только эскизы (как и ожидалось)
  2. При нажатии на изображение появляется миниатюра, а не маленькое изображение.
  3. После появления этого эскиза загружается непосредственно большое изображение (без отображения маленького изображения).

Я хочу, чтобы произошло следующее

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

Или следующее

  1. Эскизы
  2. Сразу к большому изображению.

Проблема с большим пальцем заключается в том, что я обрезаю его так, чтобы он был квадратным.

Это означает, что когда уменьшенное изображение отображается в главном средстве просмотра (после нажатия большого пальца), оно становится слишком большим, а когда загружается большое изображение, оно сразу же уменьшается до нужного размера.

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

У кого-нибудь есть какие-либо предложения о том, как это исправить?
Это лучший способ просто сделать большие пальцы с одинаковым соотношением сторон?

Я был бы признателен за любые советы по этому вопросу

Ответ №1:

Глядя на источник three20, я вижу, что TTPhotoView загружает изображение предварительного просмотра, используя следующую логику:

 - (BOOL)loadPreview:(BOOL)fromNetwork {
  if (![self loadVersion:TTPhotoVersionLarge fromNetwork:NO]) {
    if (![self loadVersion:TTPhotoVersionSmall fromNetwork:NO]) {
      if (![self loadVersion:TTPhotoVersionThumbnail fromNetwork:fromNetwork]) {
        return NO;
      }
    }
  }
  return YES;
}
  

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

Я бы предположил, что вашим лучшим решением было бы отредактировать эскизы, чтобы они имели то же соотношение сторон, что и большие изображения. Это то, чего, похоже, ожидал разработчик этого класса!

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

1. Как вы думаете (если это возможно), было бы разумно с точки зрения сети / скорости заставить three20 загружать маленькое изображение при нажатии, а затем большое?

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

Ответ №2:

Я думаю, у вас есть три пути:

  1. измените фактическую loadPreview реализацию с TTPhotoView таким образом, чтобы она реализовывала нужную вам логику (т. Е. Позволяла загружать уменьшенную версию из сети);

  2. подкласс TTPhotoView и переопределение loadPreview с тем же эффектом, что и выше;

  3. предварительно кэшируйте небольшие версии ваших фотографий; т.Е. Измените / подкласс TTThumbView так, чтобы при TTPhotoVersionThumbnail установке он предварительно кэшировал TTPhotoVersionSmall версию; в этом случае, поскольку изображение уже присутствует локально, loadPreview оно найдет его без необходимости выходить в сеть; в качестве исключения, вы можете сделатьпредварительное кэширование в любое время, которое вы считаете подходящим для вашего приложения; для предварительного кэширования изображения, которое вы создали TTButton бы с правильным URL (это будет иметь дело как с TTURLRequest, так и с кешем для вас);

  4. в противном случае вы могли бы выполнить обрезку на лету от уменьшенной версии до уменьшенной версии, используя эту категорию UIImage; в этом случае вам также следует настроить способ TTThumbView рисования, переопределив его imageForCurrentState метод, чтобы обрезка применялась при необходимости. Опять же, вы либо изменяете его напрямую TTThumbView , либо создаете подкласс; в качестве альтернативы вы можете определить layoutSubviews в своем контроллере просмотра фотографий и изменить там каждый из TTThumbView имеющихся у вас файлов:

     - (void)layoutSubviews {
        [super layoutSubviews];
        for (NSInteger i = 0; i < _thumbViews.count;   i) {
             TTThumbView* tv = [_thumbViews objectAtIndex:i];
             [tv contentForCurrentState].image = <cropped image>;
      

Если вы предпочитаете не использовать частный метод contentForCurrentState , вы можете просто сделать:

             [tv addSubview:<cropped image>];
  

Как вы можете видеть, у каждого варианта будут свои плюсы и минусы; 1 и 2 проще всего реализовать, но уменьшенная версия будет загружаться из сети, поэтому может добавить некоторую задержку; то же самое справедливо и для 4, хотя подход отличается; 3 дает вам наиболее гибкую реализацию(без дополнительной задержки из сети, поскольку вы предварительно кэшируете), но это, возможно, самое сложное решение для реализации (либо вы загружаете изображение и кэшируете его самостоятельно, либо используете TTButton, чтобы сделать это за вас, что не очень «чисто»).

В любом случае, надеюсь, это поможет.