2013-04-24 2 views
1

Я использую библиотеку SDWebImage для кэширования изображений в своих приложениях, но не смог правильно отображать изображения сетчатки.iOS SDWebImage - Как правильно обрабатывать изображения сетчатки на разных устройствах?

Я знаю, что было много разговоров о загрузке изображений сетчатки на странице github, но не может реально сказать, было ли оно полностью разрешено и нет никаких «официальных» инструкций.

Поскольку мое приложение является универсальным, будет 4 варианта каждого загружаемого изображения. Вот пример:

Что такое правильный способ, чтобы загрузить эти изображения и использовать устройство с помощью SDWebImage?

Я попробовал загрузить изображение @ 2x-iphone.png на своем iPhone 5, но он отобразил изображение, взорванное и неровное, как будто он не знал, что это было изображение @ 2x.

Каков правильный метод обработки изображений сетчатки с несколькими типами устройств?

ответ

4

Во-первых, причина - UIImage не знает, образ изображения сетчатки или обычного изображения. Когда вы вызываете -[UIImage imageNamed:], он вызывает -[UIImage imageWithData:scale:] с соответствующим значением для шкалы.

Ваша проблема вызвана ошибкой в ​​SDWebImage. См. source. Пожалуйста, продолжайте и file a bug, если он еще не существует.

Проблема заключается в том, что SDWebImage ищет только имена файлов @ 2x.png/jpeg, чтобы определить, является ли это изображение сетчатки или нет. Вы можете продолжить и исправить эту функцию, чтобы также проверить имена файлов @ 2x ~ iphone.png/@ 2x ~ ipad.png.

В качестве альтернативы, если вы не хотите трогать код SDWebImage, в вашем webImageManager:didFinishWithImage:forURL:userInfo: обратного вызова, проверьте, если имя файла является сетчатка изображение, и если да, то это:

image = [UIImage imageWithCGImage: image.CGImage scale: [UIScreen mainScreen].scale] 
+0

Спасибо! Это заставило меня указывать в правильном направлении! Это была проблема с фильтрующей строкой, используемой для обнаружения сетчатки. См. Мой ответ ниже. – JimmyJammed

+0

@ Mar0ux Молодцы, спасибо! Но отредактируйте свой ответ, потому что есть небольшая ошибка. imageWithData не будет принимать image.CGImage (это должен быть тип NSData), поэтому, вероятно, это должно быть [UIImage imageWithCGImage: image.CGImage scale: [UIScreen mainScreen] .scale orientation: UIImageOrientationUp]. – KlimczakM

+1

@ KlimczakM Сделано. Благодаря! – Mar0ux

0

Обнаруженный что SDWebImage только используя приведенную ниже фильтр, чтобы определить, является ли изображение было сетчатка или нет (находится в SDWebImageCompat.m):

NSRange range = [path rangeOfString:@"@2x." options:0 range:NSMakeRange(path.length - 8, 5)]; 

Потому что искал только «@ 2x.» (обратите внимание на период) и только если он упал в конце строки, поэтому изображения с именами типа «[email protected]~iphone.png» не будут обнаружены как сетчатка.

Обновлен код для поиска по всему URL-адресу изображения "@ 2x". Только озабоченность в связи с этим вы не можете использовать «@ 2x» где-нибудь еще в URL (но что разработчик никогда не использует такого рода именования?):

NSRange range = [path rangeOfString:@"@2x" options:0 range:NSMakeRange(0,path.length)]; 

Я также представил запрос тянущий на странице SDWebImage GitHub (https://github.com/rs/SDWebImage/pull/370)

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