Как отобразить прогрессивный JPEG в UIImageView во время его загрузки?

Скачать изображение из сети и показать его в UIImageView довольно просто. Однако для этого требуется, чтобы изображение было полностью загружено, прежде чем оно будет показано пользователю, полностью подавляя прогрессивные изображения JPEG (и PNG).

Как я могу воспроизвести частично загруженные изображения во время передачи? Я мог бы представить, что в SDK есть какая-то функция обратного вызова, которая обновляет изображение, но я не могу найти такую ​​функцию. Возможно ли это вообще с текущим iOS SDK?

3 ответа

Решение

Вы пытались визуализировать UIImage частично при вызове didReceiveData…? Что-то вроде …

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //TODO: add some error handling in case the image could not be created
    UIImage *img=[UIImage imageWithData:data];
    if (img) {
        self.imageView.image=img;
    }
}

Я знаю, что у этой публикации около 1 года, но на всякий случай, если кто-то ее ищет, есть проект под названием NYXImagesKit, который делает то, что вы ищете.

У него есть класс с именем NYXProgressiveImageView это подкласс UIImageView,

Все, что вам нужно сделать, это:

NYXProgressiveImageView * imgv = [[NYXProgressiveImageView alloc] init];
imgv.frame = CGRectMake(0, 0, 320, 480);
[imgv loadImageAtURL:[NSURL URLWithString:@"http://yourimage"]];
[self.view addSubview:imgv];
[imgv release];

Кроме того, хорошим вариантом является сохранение ваших изображений как interlaced так что он загружается с низким качеством и улучшается с загрузкой. Если изображение не чересстрочное, оно загружается сверху вниз.

Теперь в дополнение к libjpeg-turbo есть небольшая библиотека с открытым исходным кодом, которая позволяет легко декодировать и отображать прогрессивные JPEG:

let imageView = CCBufferedImageView(frame: ...)
if let url = NSURL(string: "http://example.com/yolo.jpg") {
    imageView.load(url)
}

см. https://github.com/contentful-labs/Concorde

Другие вопросы по тегам