我已创建此方法来调整图片大小。
+ (UIImage *)imageFromImage:(UIImage *)image scaledToSize:(CGSize)newSize {
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
一切正常,但如果我在另一个线程中调用此方法,它会在drawInRect:
我使用这些行在另一个线程中调用此方法:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < [images count]; i++){
UIImage *img = [UIImage imageWithContentsOfFile:[images objectAtIndex:i]];
CGFloat wImg = img.size.width * imageViewSize / img.size.height;
CGSize size = CGSizeMake(wImg, imageViewSize);
img = [Utility imageFromImage:img scaledToSize:size];
}
});
我该怎么办?
答案 0 :(得分:1)
如前所述,请注意除主线程之外的其他线程的UI类。请尝试使用Core Graphics。
更改此行:
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
为:
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextConcatCTM(context, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, newSize.height), 1.f, -1.f));
CGContextDrawImage(context, CGRectMake(0, 0, newSize.width, newSize.height), image.CGImage);
第二行将翻转Y轴,使其像UIKit DrawInRect一样工作。
答案 1 :(得分:0)
根据经验:总是在主线程上做UI内容。
有关可以在后台完成的详细信息,您必须仔细检查文档:
并非所有UIKit类都是线程安全的。在对应用程序主线程以外的线程执行与绘图相关的操作之前,请务必查看文档。
根据this answer,行为似乎是iOS版本特定的。