iOS Dibujar text en el centro de forms

Estoy intentando dibujar text en el centro de las forms en iOS, un ejemplo sería la forma de inserción de Microsoft Office, ver: https://www.dropbox.com/s/cgqyyuvy6hcv5g8/Screenshot%202014-01-21%2013.48.17 .png

Tengo una matriz de coorderadas que se utilizan para formar la forma, que funciona bien para crear la forma real.

Mi primera táctica fue seguir esta pregunta stackoverflow: Core Text With Asymmetric Shape en iOS, pero solo puedo hacer que dibuje el text en la parte inferior de la forma. ¿Hay alguna manera de centrar el text vertical y horizontalmente?

Luego eché un vistazo al nuevo TextKit, pero me quedé atrapado con la forma de subclass NSTextContainer para aceptar un CGPath o una matriz de coorderadas para crear el contenedor de text para dibujar dentro.

Mi solución de copy de security consiste en utilizar el text principal para dibujar el text en la coorderada central de una forma, pero esto hará que el text se dibuje fuera de la forma en algunas forms, como un triángulo en ángulo recto.

Alternativamente, ¿hay algún otro método que pueda usar para get algo de text en el centro de una forma?

Gracias,

Danielle

Me cherrypicked de estas respuestas y de las preguntas relacionadas, ninguna de ellas fue realmente satisfactoria, y se me ocurrió esta solución simple:

UIGraphicsBeginImageContext(CGSize.init(width: imageWidth, height: imageHeight)) let string = "ABC" as NSString let attributes = [ NSFontAttributeName : UIFont.systemFontOfSize(40), NSForegroundColorAttributeName : UIColor.networkingColor() ] // Get the width and height that the text will occupy. let stringSize = string.sizeWithAttributes(attributes) // Center a rect inside of the image // by going half the difference to the right and down. string.drawInRect( CGRectMake( (imageWidth - stringSize.width) / 2, (imageHeight - stringSize.height) / 2, stringSize.width, stringSize.height ), withAttributes: attributes ) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() 

El resultado (no importa los colors):

String ABC centrado en la imagen

Eso es un poco complicado. Primero tienes que crear un context. (bounds.size es el tamaño de la image)

 UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); 

A continuación, obtenga el cuadro delimitador del text: (la fuente es la fuente que desea usar)

 CGSize textSize = [yourText sizeWithAttributes:@{NSFontAttributeName:font}]; 

dibuja tu text en el context (xey marca el centro de la image)

 [yourText drawAtPoint:CGPointMake(x, y) withAttributes:@{NSFontAttributeName:font}]; 

Obtener la image

 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

Context de la image final

 UIGraphicsEndImageContext(); 

No lo he probado, pero es el path a seguir.

Swift 3 Versión de la respuesta de Luca Davanzo

 struct UIUtility { static func imageWithColor(color: UIColor, circular: Bool) -> UIImage? { let size: CGFloat = circular ? 100 : 1; let rect = CGRect(x: 0.0, y: 0.0, width: size, height: size) UIGraphicsBeginImageContext(rect.size) if let context = UIGraphicsGetCurrentContext() { context.setFillColor(color.cgColor) if(circular) { context.fillEllipse(in: rect) } else { context.fill(rect) } let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } return nil } static func drawText(text: NSString, font: UIFont, image: UIImage, point: CGPoint, textColor: UIColor = UIColor.white) -> UIImage? { UIGraphicsBeginImageContext(image.size) image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) let rect = CGRect(x: point.x, y: point.y, width: image.size.width, height: image.size.height) text.draw(in: rect.integral, withAttributes: [ NSFontAttributeName: font, NSForegroundColorAttributeName: textColor ]) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } static func circleImageWithText(text: String, font: UIFont, circleColor: UIColor, textColor: UIColor = UIColor.white) -> UIImage? { if let image = UIUtility.imageWithColor(color: circleColor, circular: true) { let textSize = NSString(string: text).size(attributes: [ NSFontAttributeName: font]) let centerX = ((image.size.width) / 2.0) - (textSize.width / 2.0) let centerY = ((image.size.height) / 2.0) - (textSize.height / 2.0) let middlePoint = CGPoint(x: centerX, y: centerY) return UIUtility.drawText(text: text as NSString, font: font, image: image, point: middlePoint) } return nil } } 

Swift 2.0 compatible.

Mi propósito era dibujar una forma de círculo con el text centrado dentro.

 struct UIUtility { static func imageWithColor(color: UIColor, circular : Bool) -> UIImage { let size : CGFloat = circular ? 100 : 1; let rect = CGRectMake(0.0, 0.0, size, size) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(context, color.CGColor) if(circular) { CGContextFillEllipseInRect(context, rect) } else { CGContextFillRect(context, rect) } let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } static func drawText(text: NSString, font: UIFont, image: UIImage, point: CGPoint, textColor: UIColor = UIColor.whiteColor()) -> UIImage { UIGraphicsBeginImageContext(image.size) image.drawInRect(CGRectMake(0, 0, image.size.width, image.size.height)) let rect = CGRectMake(point.x, point.y, image.size.width, image.size.height) text.drawInRect(CGRectIntegral(rect), withAttributes: [ NSFontAttributeName: font, NSForegroundColorAttributeName : textColor ]) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } static func circleImageWithText(text text: String, font: UIFont, circleColor: UIColor, textColor: UIColor = UIColor.whiteColor()) -> UIImage { let image = UIUtility.imageWithColor(circleColor, circular: true) let textSize = NSString(string: text).sizeWithAttributes([ NSFontAttributeName: font]) let centerX = (image.size.width / 2.0) - (textSize.width / 2.0) let centerY = (image.size.height / 2.0) - (textSize.height / 2.0) let middlePoint = CGPointMake(centerX, centerY) return UIUtility.drawText(text, font: font, image: image, point: middlePoint) } 

}

Con esta utilidad podemos crear fácilmente una image de esta manera:

 let font = UIFont() let image = UIUtility.circleImageWithText(text: "Center text", font: font, circleColor: UIColor.blackColor())