#ios #image #swift #retina-display #sdwebimage
#iOS #изображение #swift #сетчатка-дисплей #sdwebimage
Вопрос:
Я использую SDWebImage для загрузки и изображения из Интернета и устанавливаю его в качестве маркера на карте. URL-адрес изображения может меняться со временем. Из-за этого я использую перенаправление URL, которое остается стабильным и указывает на исходный URL. К сожалению, что-то не так с изображением при загрузке через перенаправление. Изображение всегда отображается в два раза больше, чем должно быть при загрузке с URL-адреса перенаправления. Он отображается правильно при загрузке с исходного URL-адреса.
Я добавил вывод журнала, который выводит размер изображения. Выходные данные для изображения, загруженного с URL-адреса перенаправления, составляют 88×88, а для изображения с исходного URL-адреса — 44×44. Изображение имеет размер 88×88 пикселей. Я использую симулятор с дисплеем retina, поэтому я думаю, что правильный размер должен быть 44×44 точки. URL-адрес перенаправления определенно перенаправляет на правильное изображение, я проверил это в браузере. Как размер может отличаться для одного и того же изображения?
Мой код:
let url=NSURL(string:"http://redirectionurl/asdf")
// let url=NSURL(string:"http://originalurl.com/image@2x.png")
var managerCompletedBlock:(UIImage!, NSError!,SDImageCacheType,Bool) -> Void = {
image,error,cacheType,finished in
if(finished){
println("finished")
if let e = error
{
if let s = e.localizedDescription
{
println(s)
}
}
log.debug("size: (image.size.width) (image.size.height)")
imageToLoad.icon = image
} else {
println("fail!!!!");
}
}
self.imageManager.downloadWithURL(url, options: SDWebImageOptions.HighPriority, progress: nil, completed: managerCompletedBlock)
Я сделал снимок экрана. Маркер с левой стороны загружается с исходного URL-адреса, а маркер с правой стороны загружается с URL-адреса перенаправления: http://bayimg.com/JAOPmaAFp
Комментарии:
1. Пожалуйста, загрузите оба изображения (исходное и перенаправленное) на свой компьютер и проверьте, были ли они отправлены с одинаковыми заголовками и одинаковым содержимым файла.
2. @Alexander: оба совпадают, за исключением имени файла. Изображение с URL-адреса перенаправления не имеет «@2x» в имени файла. Может ли это быть проблемой?
3. Почему понижающий голос? Есть ли что-то, что я должен изменить в своем вопросе?
Ответ №1:
SDWebImage имеет следующий код в SDWebImageCompat.m в методе SDScaledImageForKey:
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
CGFloat scale = 1.0;
if (key.length >= 8) {
// Search @2x. at the end of the string, before a 3 to 4 extension length (only if key len is 8 or more @2x. 4 len ext)
NSRange range = [key rangeOfString:@"@2x." options:0 range:NSMakeRange(key.length - 8, 5)];
if (range.location != NSNotFound) {
scale = 2.0;
}
}
UIImage *scaledImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:scale orientation:image.imageOrientation];
image = scaledImage;
}
Вы заметите, что он обнаружил стандартное «@ 2x» в имени файла и соответствующим образом масштабирует изображение. Похоже, что ключ, который он проверяет на @2x, по умолчанию просто настраивается по переданному URL-адресу, прежде чем произойдет какое-либо перенаправление.
Если то, что у вас сейчас работает, я бы, вероятно, просто изменил ваш URL-адрес перенаправления, чтобы он заканчивался на «@2x.png». Кроме того, с первого взгляда кажется, что вы можете «перехватить» ключ кэша URL, предоставив свой собственный cacheKeyFilter (проверьте README для получения дополнительной информации.) Вероятно, это не предназначено для этой цели, но я предполагаю, что если бы вы предоставили фильтр ключей кэша, который использовал ключ, чтобы всегда добавлять «@2x.png» в конец, это, вероятно, обеспечило бы согласованное поведение масштабирования.