使用afnetworking在异步模式下以异步模式调整uiimage



我在应用程序中使用afnetwork从我的Web服务中获取一些数据。在这些数据中,有一些随机大小的图像,我需要添加一些UIImageView。

我的问题是在UIImageView的正确标度中调整图像,以异步模式。

任何想法如何做?

编辑

我正在使用afnetwoking项目的普通方法:

 [self setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"img_my_nophoto"]];

此方法中的逻辑是:

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
          placeholderImage:(UIImage *)placeholderImage 
                   success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                   failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure
{
    [self cancelImageRequestOperation];
UIImage *cachedImage = [[[self class] af_sharedImageCache] cachedImageForRequest:urlRequest];
if (cachedImage) {
    self.image = cachedImage;
    self.af_imageRequestOperation = nil;
    if (success) {
        success(nil, nil, cachedImage);
    }
} else {
    self.image = placeholderImage;
    AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
    [requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) {
            self.image = responseObject;
            self.af_imageRequestOperation = nil;
        }
        if (success) {
            success(operation.request, operation.response, responseObject);
        }
        [[[self class] af_sharedImageCache] cacheImage:responseObject forRequest:urlRequest];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if ([[urlRequest URL] isEqual:[[self.af_imageRequestOperation request] URL]]) {
            self.af_imageRequestOperation = nil;
        }
        if (failure) {
            failure(operation.request, operation.response, error);
        }
    }];
    self.af_imageRequestOperation = requestOperation;
        [[[self class] af_sharedImageRequestOperationQueue] addOperation:self.af_imageRequestOperation];
    }
}

完整的班级代码:https://github.com/afnetworking/afnetworking/blob/master/master/afnetworking/uiimageview+afnetworking.m

解决方案

我解决了用

设置uiimageView的问题

self.contentmode = uiviewContentModesCaleaspectFill;

self.clipstobounds = yes;

基本上,这是用适当的比例设置图像,并切割所有边缘。

有一个AF UIImageView类别的变体,当异步图像请求完成时调用块。

您可以将返回的图像调整在成功块中并将其分配给图像视图。参见

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
              placeholderImage:(UIImage *)placeholderImage 
                       success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success
                       failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure

调整了图像大小后,请确保使用GCD将图像分配给主队列的UIImageView,因为该块将在背景线程中调用。

这是一个使用UIIImageView的示例,其内容模式将其设置为fackfill。使用核心图形调整大小通常比让UiimageView reccale映像更好。

__weak typeof(self) weakSelf = self;
CGSize targetSize = self.targetImageView.bounds.size;
[self.targetImageView setImageWithURL:photoURL success:^(UIImage *image) {
    CGFloat imageHeight = image.size.height;
    CGFloat imageWidth = image.size.width;
    CGSize newSize = targetSize;
    CGFloat scaleFactor = targetSize.width / imageWidth;
    newSize.height = imageHeight * scaleFactor;
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *small = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    dispatch_async(dispatch_get_main_queue(),^ {
        weakSelf.targetImageView.image = small;
    });
} failure:^(NSError *error) {
    // Handel the error here
}];

编辑:

如果我正确理解您的问题,您只需要在afnetworking fw的图像视图上设置imageView.contentMode = UIViewContentModeScaleAspectFit

或者您可以使用以下方式检查图像的实际大小:imageView.image.size并相应地设置ImageView的框架。

这就是AFImageResponseSerializer的目的。只需更改图像刻度以匹配您要检索的图像比例。

AFImageResponseSerializer *imageResponseSerializer = [self.avatarImageView imageResponseSerializer]; [imageResponseSerializer setImageScale:1.0];

最新更新