swift - 异步使用 renderInContext 时 UILabel 文本不是渲染器
swift - UILabel text not renderer when using renderInContext asynchronously
我需要从由 UIImageView
和 UILabel
组成的自定义视图生成图像。
我不能使用新的 iOS 7 drawViewHierarchyInRect:afterScreenUpdates:
因为我在 iPhone 6/6+ (iOS8 scale glitch when calling drawViewHierarchyInRect afterScreenUpdates:YES)[=19= 上有一些丑陋的故障]
所以我使用 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)
}
}
}
我认为问题是在这个后台队列中执行完成。 UI 更新必须在主线程上进行,因此可以使用。
dispatch_async(dispatch_get_main_queue()) {
completion(image)
}
在主线程之外的其他线程中渲染 UILabel
似乎存在问题。
您最好的选择是使用 NSString
的方法 drawInRect:withAttributes:
来绘制文本。
我需要从由 UIImageView
和 UILabel
组成的自定义视图生成图像。
我不能使用新的 iOS 7 drawViewHierarchyInRect:afterScreenUpdates:
因为我在 iPhone 6/6+ (iOS8 scale glitch when calling drawViewHierarchyInRect afterScreenUpdates:YES)[=19= 上有一些丑陋的故障]
所以我使用 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)
}
}
}
我认为问题是在这个后台队列中执行完成。 UI 更新必须在主线程上进行,因此可以使用。
dispatch_async(dispatch_get_main_queue()) {
completion(image)
}
在主线程之外的其他线程中渲染 UILabel
似乎存在问题。
您最好的选择是使用 NSString
的方法 drawInRect:withAttributes:
来绘制文本。