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

Как создать UIImageView с изображением по такой ссылке http://img.abc.com/noPhoto4530.gif?


person asedra_le    schedule 25.08.2010    source источник


Ответы (8)


Вот фрагмент кода для тех, кто хочет использовать новый набор классов NSURLSession в iOS 7:

// Set NSURLSessionConfig to be a default session
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

// Create session using config
NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

// Create URL
NSURL *url = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo11w.png"];

// Create URL request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"GET";

// Create data task
NSURLSessionDataTask *getDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    // Okay, now we have the image data (on a background thread)
    UIImage *image = [UIImage imageWithData:data];

    // We want to update our UI so we switch to the main thread
    dispatch_async(dispatch_get_main_queue(), ^{

        // Create image view using fetched image (or update an existing one)
        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

        // Do whatever other UI updates are needed here on the main thread...
    });
}];

// Execute request
[getDataTask resume];
person John Erck    schedule 29.01.2014
comment
В любом случае принятый ответ - это довольно старая и плохая практика. Это правильный ответ (конечно, при правильной обработке ошибок;)). - person Ben Scheirman; 04.03.2015

Если вы хотите загрузить изображение в фоновом режиме, а затем установить его в основном потоке, вы можете сделать это следующим образом:

- (void)downloadPicture {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                NSURL *url = [NSURL URLWithString:@"http://img.abc.com/noPhoto4530.gif"];

                UIImage *image = [self getPicture:url];

                dispatch_async(dispatch_get_main_queue(), ^{

                    [self setPicture:image];

                });
            });
}

 - (UIImage *)getPicture:(NSURL *)pictureURL {

        NSData *data = [NSData dataWithContentsOfURL:pictureURL];
        UIImage *image = [UIImage imageWithData:data];

        return image;    
}

 - (void)setPicture:(UIImage *)image {

        UIImageView * imageView = [[UIImageView alloc] initWithFrame:
                               CGRectMake(kPictureX, kPictureY, image.size.height, image.size.width)];

        [imageView setImage:image];

        [self.view addSubview: imageView];

}
person neowinston    schedule 13.07.2013

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

NSURL *url = [NSURL URLWithString:@"http://img.abc.com/noPhoto4530.gif"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];

UIImageView * myImageView = [[UIImageView alloc] initWithImage:image];
[someOtherView addSubview:myImageView];
[myImageView release];
person neowinston    schedule 21.01.2013

Загрузите изображение по локальному пути на вашем устройстве, затем получите UIImage от imageWithContentsOfFile и используйте его для установки изображения в UIImageView. Не забудьте когда-нибудь очистить ваш файл изображения.

person No one in particular    schedule 25.08.2010

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

person imaginaryboy    schedule 25.08.2010

Такой же ответ может быть здесь

NSURL *urlLink = [NSURL URLWithString:@"http://img.abc.com/noPhoto4530.gif"];
NSData *dataURL = [NSData dataWithContentsOfURL:urlLink];
UIImage *imageData = [UIImage imageWithData:dataURL];
UIImageView *imageView = [[UIImageView alloc] initWithImage:imageData];
person user3182143    schedule 29.08.2015

вы можете попробовать современный стиль gcd (xcode 8.0+):

let queue = DispatchQueue(label: "com.mydomain.queue3")
queue.async {
    let imageURL: URL = URL(string: "https://www.brightedge.com/blog/wp-content/uploads/2014/08/Google-Secure-Search_SEL.jpg")!
    guard let imageData = try? Data(contentsOf: imageURL) else {
        return
    }
    DispatchQueue.main.async {
        self.imageView.image = UIImage(data: imageData)
    }
}

вы также можете заменить первый DispatchQueue на URLSession.dataTask

let imageURL: URL = URL(string: "https://www.brightedge.com/blog/wp-content/uploads/2014/08/Google-Secure-Search_SEL.jpg")!

(URLSession(configuration: URLSessionConfiguration.default)).dataTask(with: imageURL, completionHandler: { (imageData, response, error) in

    if let data = imageData {
        print("Did download image data")

        DispatchQueue.main.async {
            self.imageView.image = UIImage(data: data)
        }
    }
}).resume()
person Shijing Lv    schedule 03.05.2017

person    schedule
comment
Отлично работает! Не могу представить, что dataWithContentsOfURL находится в своем статическом методе. Кстати, я использую Xamarin. - person Howard; 07.03.2014
comment
Могу ли я отключить просмотр изображения по таймауту? при медленном подключении к Интернету приложение может вылететь из строя, поэтому я хочу добавить тайм-аут @nszombie - person Gökhan Çokkeçeci; 04.04.2014
comment
Обратите внимание, что это не лучшее решение, поскольку оно блокирует основной поток, ожидающий загрузки. Подход асинхронной загрузки данных намного лучше. - person MoDJ; 24.02.2016