SWIFT - 异步使用renderInContext时的UILabel文本不渲染程序(swift

2019-10-23 05:44发布

我需要生成从由构成的自定义视图的图像UIImageViewUILabel

我不能使用新的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)
        }
    }
}

Answer 1:

这似乎有问题,渲染UILabel在其他线程比主之一。
最好的选择是使用的方法drawInRect:withAttributes:NSString绘制你的文字。



Answer 2:

我认为这个问题是在完成在这一背景队列执行。 UI更新必须在主线程因此可能与工作。

dispatch_async(dispatch_get_main_queue()) {
    completion(image)
}


文章来源: swift - UILabel text not renderer when using renderInContext asynchronously