首先,我正在使用这个AFNetworking
方法:
[imageView setImageWithURL:[NSURL URLWithString:@"http://site.com/img.png"]];
1 - 此方法是异步的?它会将图像缓存在iPhone中吗?
2 - 如何裁剪/调整此图片的大小?我在URL中有一个800x600的图像,但我的UIImageView是400x400,我只想在显示之前裁剪url图像,相同的比例,如600x600(不需要400x400,只是相同的比例)。喜欢facebook app。
答案 0 :(得分:17)
调整大小已在其他地方得到解答,但对于您的第一个问题:
这个方法是异步的吗?
是的,它是异步的。如果要处理图像,可以使用回调块,例如:
[imageView setImageWithURLRequest:request
placeholderImage:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// do image resize here
// then set image view
imageView.image = image;
}
failure:nil];
然后你问:
它会将图像缓存在iPhone中吗?
如果您只是出于性能原因而希望缓存在内存中,那么答案是肯定的。它使用NSCache
(在内存压力下将被清空)。另外,它会将图像缓存为检索图像,而不是反映事后调整后的图像。
如果您希望缓存在持久存储中(即即使您终止应用并重新启动它也会保持缓存),那么这个问题就不太清楚了。 AFNetworking
声称通过使用NSURLCache
来支持磁盘缓存,但我在使用iOS时遇到了问题。如果您需要持久存储缓存,我可能会建议其他各种UIImageView
类别,例如SDWebImage
。
无论如何,对于有关缓存的AFNetworking官方专线,我可能会推荐您参加 AFNetworking常见问题解答中的Caching讨论。
如果您想要活动指示器视图,您可以:
UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicatorView.center = self.imageView.center;
[self.view addSubview:activityIndicatorView];
[activityIndicatorView startAnimating];
[imageView setImageWithURLRequest:request
placeholderImage:nil
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
[activityIndicatorView removeFromSuperview];
// do image resize here
// then set image view
imageView.image = image;
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
[activityIndicatorView removeFromSuperview];
// do any other error handling you want here
}];
答案 1 :(得分:2)
获取裁剪图片:
UIImage *croppedImg = nil;
CGRect cropRect = CGRectMake(AS YOu Need);
croppedImg = [self croppIngimageByImageName:self.imageView.image toRect:cropRect];
使用以下方法返回UIImage
(,如您所希望的图片尺寸)
- (UIImage *)croppIngimageByImageName:(UIImage *)imageToCrop toRect:(CGRect)rect
{
//CGRect CropRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height+15);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return cropped;
}
在这里你得到通过上述方法返回的Croped Image;
或重新调整
对于调整UII图像 图像,使用以下方法对特定的高和宽度:
+ (UIImage*)resizeImage:(UIImage*)image withWidth:(int)width withHeight:(int)height
{
CGSize newSize = CGSizeMake(width, height);
float widthRatio = newSize.width/image.size.width;
float heightRatio = newSize.height/image.size.height;
if(widthRatio > heightRatio)
{
newSize=CGSizeMake(image.size.width*heightRatio,image.size.height*heightRatio);
}
else
{
newSize=CGSizeMake(image.size.width*widthRatio,image.size.height*widthRatio);
}
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
此方法返回 NewImage ,具有您想要的特定大小。
答案 2 :(得分:0)
来自AFNetworking v.2.0,AFCoreImageSerializer
响应序列化程序用于从服务器响应和响应数据创建图像表示。默认情况下,这是
的实例AFImageResponseSerializer
AFImageResponseSerializer
的子类可用于执行后处理,例如色彩校正,人脸检测或其他效果。
您可以在设置为UIImageView
之前使用此功能裁剪图像。
答案 3 :(得分:0)
我有一个代码示例可以添加到Hemang的答案中。
这是AFImageResponseSerializer
的用途。只需更改图像比例即可匹配您正在检索的图像比例。
AFImageResponseSerializer *imageResponseSerializer = [self.avatarImageView imageResponseSerializer];
[imageResponseSerializer setImageScale:1.0];