UIImage от CALayer в iOS
В моем приложении я создал CALayer
(с несколькими подуровнями - CALayer состоит из фигур, добавленных в качестве подслоев).
Я пытаюсь создать UIImage
что я смогу загрузить на сервер (у меня есть код для этого). Тем не менее, я не могу понять, как добавить CALayer
к UIImage
,
Это возможно?
4 ответа
Решение
Похоже, вы хотите сделать свой слой в UIImage. В этом случае метод ниже должен сделать свое дело. Просто добавьте это в ваш класс представления или контроллера или создайте категорию на CALayer.
- (UIImage *)imageFromLayer:(CALayer *)layer
{
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0);
[layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return outputImage;
}
Ответ Тодда правильный, однако для экранов сетчатки должна быть небольшая разница:
- (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;
}
Я создал расширение 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
}
}
Использование:
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)
Версия 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()
}
}