example - UIImage от CALayer-iPhone SDK



objective-c uiimageview (3)

В моем приложении я создал CALayer (с несколькими подслоями - CALayer состоит из форм, добавленных в качестве подслоев).

Я пытаюсь создать UIImage который я смогу загрузить на сервер (у меня есть код для этого). Однако я не могу понять, как добавить CALayer в UIImage .

Это возможно? Любой совет будет отличным и очень оцененным.

Большое спасибо, Бретт

https://ffff65535.com


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()
  }
}

Для этого я создал расширение 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)

Похоже, вы хотите сделать свой слой в UIImage. В этом случае метод ниже должен сделать трюк. Просто добавьте это в свой класс просмотра или контроллера или создайте категорию на CALayer.

- (UIImage *)imageFromLayer:(CALayer *)layer
{
  UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0);

  [layer renderInContext:UIGraphicsGetCurrentContext()];
  UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsEndImageContext();

  return outputImage;
}




uiimageview