Загрузка изображений нестандартных размеров с iOS

Я попадаю на сервер, на котором уже есть миниатюры изображений. Чтобы получить эскиз изображения, вы просто устанавливаете атрибут размера в URL-адресе ресурса изображения.

Я использую bumptech / glide в проекте Android, и он отлично работает. В IE для glide вы реализуете метод, который передает ширину и высоту представления (вычисляется с помощью glide), и вы можете использовать это, чтобы определить, как сделать запрос на изображение такого размера (или близкого) к серверу, то есть:

public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
    @Override
    protected String getUrl(MyDataModel model, int width, int height) {
        // Construct the url for the correct size here.
        return model.buildUrl(width, height);
    }
}

Есть ли что-то подобное для iOS? Я использую FastImageCache из части кеширования, но не думаю, что у него есть такая поддержка.

Худшим, я думаю, было бы просто прокрутить свою собственную (возможно, категорию), которая вычисляет, какой размер изображения запрашивать на основе размера просмотра изображения. Если я это сделаю, вероятно, будет довольно легко получить высоту и ширину или изображение, но нужно ли мне учитывать размер / масштаб устройства (1x, 2x или 3x)?


person lostintranslation    schedule 21.05.2016    source источник


Ответы (1)


Все, что вам нужно сделать, это создать соответствующий URL-адрес. Но из вашего вопроса неясно, как выглядит URL-адрес, но это всего лишь одна строка кода с использованием интерполяции строк для Swift или stringWithFormat в Objective-C.

И, да, вы действительно хотите учитывать масштаб при создании соответствующего URL-адреса для представления изображения определенного размера (например, представление изображения 44 x 44 точек на устройстве с масштабом 3 должно запрашивать изображение размером 132 x 132 пикселей).

Что касается запроса изображения и его кеширования, вы можете написать свое собственное, поскольку это тривиально. Когда вы запрашиваете изображения через NSURLSession, он незаметно кэширует их за кулисами с помощью NSURLCache (с некоторыми оговорками). Если вам нужно что-то более продвинутое (например, вы обновляете изображения в виде таблицы или коллекции и хотите выполнить отложенную загрузку), вы можете рассмотреть одно из многих UIImageView расширений для асинхронной выборки изображений (например, в Objective-C, Я бы рассмотрел категории UIKit AFNetworking или, возможно, использовал бы SDWebImage; в Swift я бы рассмотрел AlamofireImage, DFImageManager или Kingfisher).

person Rob    schedule 21.05.2016
comment
Что касается загрузки изображений @ 2x и @ 3x из API, можно загрузить только изображение в масштабе @ 1x. Таким образом, изображение, масштабируемое на бэкэнде перед вызовом API, может быть передано с правильным размером в пикселях, но UIKit интерпретирует size этого изображения в точках @ 1x, а не в пикселях. Как лучше всего установить масштаб изображения без программного увеличения или уменьшения изображения? - person slider; 04.10.2017
comment
Если вы загружаете представление JPEG / PNG, data, то есть изображение размером, скажем, 300x300 пикселей, вы можете затем создать UIImage с UIImage(data: data, scale: 3), и получившееся изображение будет 100x100 с масштабом 3. - person Rob; 04.10.2017