create iphone objective-c uiimageview

iphone - create - uiimage frame swift 4



UIImage de CALayer-iPhone SDK (4)

En mi aplicación, he creado un CALayer (con algunas subcapas: el CALayer se compone de formas agregadas como subcapas).

Estoy tratando de crear un UIImage que pueda subir a un servidor (tengo el código para esto). Sin embargo, no puedo encontrar la manera de agregar el CALayer a un UIImage .

es posible? Cualquier consejo sería excelente y muy apreciado.

Muchas gracias, Brett


Creé una extensión Swift basada en esto:

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

El uso:

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)


La respuesta de Todd es correcta, sin embargo, para las pantallas de retina debería haber una pequeña diferencia:

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


Parece que quieres renderizar tu capa en un UIImage. En ese caso, el siguiente método debería hacer el truco. Solo agregue esto a su vista o clase de controlador, o cree una categoría en CALayer.

- (UIImage *)imageFromLayer:(CALayer *)layer { UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, 0); [layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return outputImage; }


Versión de Swift 3 con un poco de error para verificar el contexto.

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