Bre*_*ett 37 objective-c calayer uiimageview uiimage ios
在我的应用程序中,我创建了一个CALayer
(有几个子层 - CALayer由添加为子层的形状组成).
我正在尝试创建一个UIImage
我将能够上传到服务器(我有这个代码).但是,我无法弄清楚如何添加CALayer
到a UIImage
.
这可能吗?
Tod*_*ell 105
听起来你想将你的图层渲染成UIImage.在这种情况下,下面的方法应该可以解决问题.只需将其添加到视图或控制器类,或在CALayer上创建一个类别.
- (UIImage *)imageFromLayer:(CALayer *)layer
{
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
Run Code Online (Sandbox Code Playgroud)
Öme*_*Gül 18
托德的答案是正确的,但对于视网膜屏幕应该有一些区别:
- (UIImage *)imageFromLayer:(CALayer *)layer
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions([layer frame].size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext([layer frame].size);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
Run Code Online (Sandbox Code Playgroud)
我已经为此创建了一个Swift扩展:
extension UIImage {
class func imageWithLayer(layer: CALayer) -> UIImage {
UIGraphicsBeginImageContextWithOptions(layer.bounds.size, layer.opaque, 0.0)
layer.renderInContext(UIGraphicsGetCurrentContext()!)
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var gradient = CAGradientLayer()
gradient.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor]
gradient.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
let image = UIImage.imageWithLayer(gradient)
Run Code Online (Sandbox Code Playgroud)
Swift 3版本,带有一点错误检查上下文.
extension UIImage {
class func image(from layer: CALayer) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(layer.bounds.size,
layer.isOpaque, UIScreen.main.scale)
defer { UIGraphicsEndImageContext() }
// Don't proceed unless we have context
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
layer.render(in: context)
return UIGraphicsGetImageFromCurrentImageContext()
}
}
Run Code Online (Sandbox Code Playgroud)