我在更新UIImageView的图像方面遇到了一些问题。我使用基本图像,我在显示之前通过绘制来修改。在没有" overlay"的情况下显示时,性能很好。但是当我生成" overlay"时,在更新视图之前需要将近10秒。基本映像是640x430 PNG文件。当图像显示时,我看不到CPU和/或内存使用量的任何高峰 - 所以我不确定它为什么花了这么长时间。如果我将图像更改为我的应用程序中捆绑的某个静态图像,它会立即更改。我在这做任何明显愚蠢的事吗?
我用来生成叠加层的代码如下所示:
func drawTextOverlay(textData:[String : [CGFloat]], sourceImage:UIImage)->UIImage {
log.debug("Overlay generation started")
UIGraphicsBeginImageContext(sourceImage.size);
sourceImage.drawInRect(CGRectMake(0,0,sourceImage.size.width,sourceImage.size.height));
for letter in textData {
let toDraw = letter.0
let pointX = letter.1[0]
let pointY = (letter.1[1])
let rect = CGRectMake(pointX, pointY, sourceImage.size.width, sourceImage.size.height)
let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
textStyle.alignment = NSTextAlignment.Left
let textColor = UIColor.redColor()
let font = UIFont.boldSystemFontOfSize(12);
let textFontAttributes = [NSFontAttributeName: font, NSForegroundColorAttributeName: textColor, NSParagraphStyleAttributeName: textStyle]
toDraw.drawInRect(rect, withAttributes: textFontAttributes)
}
let newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
log.debug("Overlay generated")
return newImage;
}
它被调用如下:
self.imageView.image = self.drawOverlay(UIImage(named:"base_image")!)
self.imageView.setNeedsDisplay()
private func drawOverlay(image:UIImage)->UIImage {
return graphicsService.drawTextOverlay(getKeys(), sourceImage: image)
}
谢谢!
修改
确保将通知发布到主线程,就像这样做了诀窍:
dispatch_async(dispatch_get_main_queue(),{
NSNotificationCenter.defaultCenter().postNotificationName("NotificationName", object: nil)
});
答案 0 :(得分:2)
视图更新前需要近10秒
这些词几乎总是意味着你试图从后台线程与界面交谈。你绝不能这样做。