Установить изображение UIImageView, используя URL - PullRequest
38 голосов
/ 10 февраля 2011

Можно ли прочитать URL-адрес изображения и установить UIImageView для изображения по этому URL-адресу?

Ответы [ 10 ]

57 голосов
/ 24 февраля 2012
NSString *ImageURL = @"YourURLHere";
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
imageView.image = [UIImage imageWithData:imageData];
54 голосов
/ 23 июля 2013

Для такой простой задачи я бы настоятельно рекомендовал не интегрировать такие проекты, как Three20, библиотека - чудовище и не очень простая в использовании.

Я бы вместо этого рекомендовал такой подход:

NSString *imageUrl = @"http://www.foo.com/myImage.jpg";
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:imageUrl]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    myImageView.image = [UIImage imageWithData:data];
}];

РЕДАКТИРОВАТЬ для Swift 3.0

let urlString = "http://www.foo.com/myImage.jpg"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
    if error != nil {
        print("Failed fetching image:", error)
        return
    }

    guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
        print("Not a proper HTTPURLResponse or statusCode")
        return
    }

    DispatchQueue.main.async {
        self.myImageView.image = UIImage(data: data!)
    }
}.resume()

* РЕДАКТИРОВАТЬ для Swift 2.0

let request = NSURLRequest(URL: NSURL(string: urlString)!)

NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in

    if error != nil {
        print("Failed to load image for url: \(urlString), error: \(error?.description)")
        return
    }

    guard let httpResponse = response as? NSHTTPURLResponse else {
        print("Not an NSHTTPURLResponse from loading url: \(urlString)")
        return
    }

    if httpResponse.statusCode != 200 {
        print("Bad response statusCode: \(httpResponse.statusCode) while loading url: \(urlString)")
        return
    }

    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.myImageView.image = UIImage(data: data!)
    })

    }.resume()
26 голосов
/ 10 февраля 2011

Можно загрузить NSData из URL-адреса и преобразовать его в изображение и вставить его в представление изображения, но это крайне плохая идея, поскольку она предполагает синхронную загрузку URL-адреса в главном потоке.Это заблокирует пользовательский интерфейс и, возможно, заставит пользователя думать, что ваше приложение зависло, если изображение загружается не очень быстро.

Редактировать : чтобы уточнить, оригинальный вопрос выглядит мнекак плакат хочет сказать что-то вроде

imageView.image = [UIImage imageWithContentsOfURL:theURL];

Отсюда мой ответ.Можно сделать эквивалент, пройдя через NSData, но это плохая идея.Вместо этого изображение должно загружаться асинхронно с использованием NSURLConnection, и только после полной загрузки оно должно быть преобразовано в UIImage и назначено для представления изображения.

24 голосов
/ 25 февраля 2012

Я использую https://github.com/rs/SDWebImage, которая представляет собой красиво оформленную библиотеку, в которой есть возможность поместить изображение-заполнитель в память, кешировать диск или использовать загрузчик независимо от UIImageView.

Я пытался сделать это сам, но библиотека убрала всю боль.

Все, что вам нужно сделать, это написать код ниже для вашего случая:

#import "UIImageView+WebCache.h"

[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

Сработало как шарм для меня.

11 голосов
/ 26 октября 2012

Если вы хотите отобразить изображение из Url в ImageView, а также хотите сохранить это изображение в кэше для оптимизации взаимодействия с сервером, это поможет вам просто передать объект imageView и строку Url этой функции

-(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{


strUrl = [strUrl encodeUrl];

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]];


NSFileManager *fileManager =[NSFileManager defaultManager];
NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];



imgView.backgroundColor = [UIColor darkGrayColor];
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imgView addSubview:actView];
[actView startAnimating];
CGSize boundsSize = imgView.bounds.size;
CGRect frameToCenter = actView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
    frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
    frameToCenter.origin.x = 0;

// center vertically
if (frameToCenter.size.height < boundsSize.height)
    frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
    frameToCenter.origin.y = 0;

actView.frame = frameToCenter;


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

    NSData *dataFromFile = nil;
    NSData *dataFromUrl = nil;

    dataFromFile = [fileManager contentsAtPath:fileName];
    if(dataFromFile==nil){
        dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];                      
    }

    dispatch_sync(dispatch_get_main_queue(), ^{

        if(dataFromFile!=nil){
            imgView.image = [UIImage imageWithData:dataFromFile];
        }else if(dataFromUrl!=nil){
            imgView.image = [UIImage imageWithData:dataFromUrl];  
            NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];

            BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];       
            if(filecreationSuccess == NO){
                NSLog(@"Failed to create the html file");
            }

        }else{
            imgView.image = [UIImage imageNamed:@"NO_Image.png"];  
        }
        [actView removeFromSuperview];
        [actView release];
        [imgView setBackgroundColor:[UIColor clearColor]];
    });
});


}
4 голосов
/ 02 июля 2014

Вот обновленный ответ на лучший ответ, так как imageWithContentsOfURL больше не является методом UIImage. Вам придется использовать CIImage:

NSURL *url = [NSURL URLWithString:@"http://url_goes_here.com/logo.png"];
imageView.image = [UIImage imageWithCIImage:[CIImage imageWithContentsOfURL:url]];
2 голосов
/ 01 марта 2012

Другим вариантом является TTImageView из библиотеки Three20, который обрабатывает асинхронную загрузку изображения.Контроль работает отлично.Однако недостатком является то, что вам приходится иметь дело с кошмаром установки Three20 (который почти невозможно полностью удалить).

2 голосов
/ 11 февраля 2011

EGOImageLoading

EGOImageView* imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"placeholder.png"]];
imageView.frame = CGRectMake(0.0f, 0.0f, 36.0f, 36.0f);

//show the placeholder image instantly
[self.anyView addSubview:imageView];
[imageView release] //if you want

//load the image from url asynchronously with caching automagically
imageView.imageURL = [NSURL URLWithString:photoURL]; 

Если вы хотите больше, есть делегат для обработки действий после загрузки

@protocol EGOImageViewDelegate<NSObject>
@optional
- (void)imageViewLoadedImage:(EGOImageView*)imageView;
- (void)imageViewFailedToLoadImage:(EGOImageView*)imageView error:(NSError*)error;
@end
2 голосов
/ 11 февраля 2011

К сожалению, эта функция недоступна на момент написания этой статьи ... вместо этого вам придется реализовать эту функцию самостоятельно:

  1. Загрузка данных изображения
  2. Сохранениеили где-то кешировать (db или файловую систему), а затем
  3. Установка UIImaveView в сохраненную структуру

К счастью, вам не нужно ломать голову, выполняя указанные функции, как Appleпредоставляет пример, который делает именно это как часть их примеров кода.

Следуйте за кодом, и я уверен, что вы сможете приспособить его к вашим потребностям.

0 голосов
/ 19 июня 2017

использование AFNetworking категория UIImageView+AFNetworking.h

 #import "UIImageView+AFNetworking.h


[profileImageView setImageWithURL:[NSURL URLWithString:photoURL] placeholderImage:[UIImage imageNamed:@"placeholder"]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...