我需要生成从由构成的自定义视图的图像UIImageView
和UILabel
。
我不能使用新的iOS 7 drawViewHierarchyInRect:afterScreenUpdates:
因为我在iPhone上一些丑陋的毛刺6分之6+( iOS8上规模毛刺调用drawViewHierarchyInRect afterScreenUpdates时:YES )
所以,我做到了使用旧的时尚之路renderInContext:
效果很好,但它是相当缓慢的。 我使用的图像生成,显示在一个标记GMSMapView
(上帝,我错过了MapKit
...),但用户体验,因为滞后的相当糟糕,由于这些图像生成。
因此,我想在后台线程,以便有一些顺利的进行图像创建操作,但这里的问题:我的大部分标签都没有渲染。
因为任何人都已经面临这个问题?
下面是我使用的代码:
func CGContextCreate(size: CGSize) -> CGContext {
let scale = UIScreen.mainScreen().scale
let space: CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()
let bitmapInfo: CGBitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedFirst.rawValue)
let context: CGContext = CGBitmapContextCreate(nil, Int(size.width * scale), Int(size.height * scale), 8, Int(size.width * scale * 4), space, bitmapInfo)
CGContextScaleCTM(context, scale, scale)
CGContextTranslateCTM(context, 0, size.height)
CGContextScaleCTM(context, 1, -1)
return context
}
func UIGraphicsGetImageFromContext(context: CGContext) -> UIImage? {
let cgImage: CGImage = CGBitmapContextCreateImage(context)
let image = UIImage(CGImage: cgImage, scale: UIScreen.mainScreen().scale, orientation: UIImageOrientation.Up)
return image
}
extension UIView {
func snapshot() -> UIImage {
let context = CGContextCreate(self.frame.size)
self.layer.renderInContext(context)
let image = UIGraphicsGetImageFromContext(context)
return image!
}
func snapshot(#completion: UIImage? -> Void) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.snapshot()
completion(image)
}
}
}