swift – 当asynchronous使用renderInContext时,UILabel文本不是渲染器
我需要从由UIImageView
和UILabel
组成的自定义视图生成图像。
我不能使用新的iOS 7 drawViewHierarchyInRect:afterScreenUpdates:
因为我在iPhone 6/6 +上有一些丑陋的故障( 当调用drawViewHierarchyInRect afterScreenUpdates:YES时iOS8缩放毛刺 )
所以我使用了renderInContext:
这种老式的方法renderInContext:
它运行良好,但速度很慢。 我正在使用图像生成在GMSMapView
显示标记(上帝,我错过了MapKit
…),但由于这些图像生成的滞后,用户体验非常糟糕。
所以我尝试在后台线程中执行图像创build操作,以获得平滑的内容,但问题在于:我的大部分标签都未呈现。
任何人都已经面临这个问题?
这是我使用的代码:
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) } } }
在主线程之外的其他线程中渲染UILabel
似乎存在问题。
您最好的select是使用NSString
drawInRect:withAttributes:
方法绘制文本。
我认为问题是在这个背景队列中执行完成。 UI更新必须位于主线程上,因此可能会起作用。
dispatch_async(dispatch_get_main_queue()) { completion(image) }