#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:
Глядя на источник 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:
Я думаю, у вас есть три пути:
-
измените фактическую
loadPreview
реализацию сTTPhotoView
таким образом, чтобы она реализовывала нужную вам логику (т. Е. Позволяла загружать уменьшенную версию из сети); -
подкласс
TTPhotoView
и переопределениеloadPreview
с тем же эффектом, что и выше; -
предварительно кэшируйте небольшие версии ваших фотографий; т.Е. Измените / подкласс
TTThumbView
так, чтобы приTTPhotoVersionThumbnail
установке он предварительно кэшировалTTPhotoVersionSmall
версию; в этом случае, поскольку изображение уже присутствует локально,loadPreview
оно найдет его без необходимости выходить в сеть; в качестве исключения, вы можете сделатьпредварительное кэширование в любое время, которое вы считаете подходящим для вашего приложения; для предварительного кэширования изображения, которое вы создалиTTButton
бы с правильным URL (это будет иметь дело как с TTURLRequest, так и с кешем для вас); -
в противном случае вы могли бы выполнить обрезку на лету от уменьшенной версии до уменьшенной версии, используя эту категорию 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, чтобы сделать это за вас, что не очень «чисто»).
В любом случае, надеюсь, это поможет.