123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /*****************************************************************************
- * VLC for iOS
- *****************************************************************************
- * Copyright (c) 2015 VideoLAN. All rights reserved.
- * $Id$
- *
- * Authors: Tobias Conradi <videolan # tobias-conradi.de>
- *
- * Refer to the COPYING file of the official project for license.
- *****************************************************************************/
- #import "VLCNetworkImageView.h"
- @implementation VLCNetworkImageView
- static NSCache *sharedImageCache = nil;
- + (void)setSharedImageCache:(NSCache *)sharedCache {
- sharedImageCache = sharedCache;
- }
- + (NSCache *)sharedImageCache {
- if (!sharedImageCache) {
- sharedImageCache = [[NSCache alloc] init];
- [sharedImageCache setCountLimit:50];
- }
- return sharedImageCache;
- }
- - (UIImage *)cacheImageForURL:(NSURL *)url {
- UIImage *image = [[self.class sharedImageCache] objectForKey:url];
- if ((image != nil) && [image isKindOfClass:[UIImage class]]) {
- return image;
- }
- return nil;
- }
- - (void)cancelLoading {
- [self.downloadTask cancel];
- self.downloadTask = nil;
- }
- - (void)setImageWithURL:(NSURL *)url {
- [self cancelLoading];
- UIImage *cachedImage = [self cacheImageForURL:url];
- if (cachedImage) {
- self.image = cachedImage;
- } else {
- __weak typeof(self) weakSelf = self;
- NSURLSession *sharedSession = [NSURLSession sharedSession];
- self.downloadTask = [sharedSession dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
- if (!data) {
- return;
- }
- UIImage *image = [UIImage imageWithData:data];
- if (!image) { return; }
- [[[weakSelf class] sharedImageCache] setObject:image forKey:url];
- [[NSOperationQueue mainQueue] addOperationWithBlock:^{
- __strong typeof(weakSelf) strongSelf = weakSelf;
- if ([strongSelf.downloadTask.originalRequest.URL isEqual:url]) {
- if (strongSelf.animateImageSetting) {
- [UIView animateWithDuration:.3 animations:^{
- strongSelf.image = image;
- }];
- } else
- strongSelf.image = image;
- strongSelf.downloadTask = nil;
- }
- }];
- }];
- [self.downloadTask resume];
- }
- }
- - (void)setImage:(UIImage *)image
- {
- [super setImage:image];
- [self setNeedsUpdateConstraints];
- [self invalidateIntrinsicContentSize];
- }
- - (void)updateConstraints
- {
- [super updateConstraints];
- CGSize size = self.image.size;
- if (self.aspectRatioConstraint && size.height && size.width) {
- NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:self
- attribute:NSLayoutAttributeWidth
- relatedBy:NSLayoutRelationEqual
- toItem:self
- attribute:NSLayoutAttributeHeight
- multiplier:size.width/size.height
- constant:0];
- [self removeConstraint:self.aspectRatioConstraint];
- [self addConstraint:newConstraint];
- self.aspectRatioConstraint = newConstraint;
- }
- }
- @end
|