Подтвердить что ты не робот

Установите изображение UIImageView с помощью URL-адреса

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

4b9b3361

Ответ 1

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

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

imageView.image = [UIImage imageWithContentsOfURL:theURL];

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

Ответ 2

NSString *ImageURL = @"YourURLHere";
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
imageView.image = [UIImage imageWithData:imageData];

Ответ 3

Для такой простой задачи я бы настоятельно рекомендовал против интеграции проектов, таких как 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];
}];

EDIT для 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()

* EDIT для 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()

Ответ 4

Я использую 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"]];

Работала как прелесть для меня.

Ответ 5

Если вы хотите отображать изображение из 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]];
    });
});


}

Ответ 6

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

NSURL *url = [NSURL URLWithString:@"http://url_goes_here.com/logo.png"];
imageView.image = [UIImage imageWithCIImage:[CIImage imageWithContentsOfURL:url]];

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

Ознакомьтесь с образцом кода Apple для LazyTableImages - IconDownloader

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

LazyTableImages, предоставляемые Apple

Ответ 11

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

 #import "UIImageView+AFNetworking.h


[profileImageView setImageWithURL:[NSURL URLWithString:photoURL] placeholderImage:[UIImage imageNamed:@"placeholder"]];