iOS在形状中心绘制文本
我试图在iOS中的形状中心绘制文本,例如Microsoft Office的插入形状请参见: 我有一个用于形成形状的坐标数组,可以很好地创建实际形状 我的第一个策略是遵循这个stackoverflow问题:但是我只能让它在形状的底部绘制文本。有没有办法使文本垂直和水平居中 然后我看了一下新的TextKit,但是我被如何子类化NSTextContainer以接受CGPath或坐标数组来创建要在其中绘制的文本容器所困扰 我的备份解决方案是使用核心文本在形状的中心坐标处绘制文本,但这将导致文本在某些形状(如直角三角形)上绘制形状外部 或者,有没有其他方法可以让一些文本位于形状的中心 谢谢,iOS在形状中心绘制文本,ios,core-graphics,core-text,textkit,Ios,Core Graphics,Core Text,Textkit,我试图在iOS中的形状中心绘制文本,例如Microsoft Office的插入形状请参见: 我有一个用于形成形状的坐标数组,可以很好地创建实际形状 我的第一个策略是遵循这个stackoverflow问题:但是我只能让它在形状的底部绘制文本。有没有办法使文本垂直和水平居中 然后我看了一下新的TextKit,但是我被如何子类化NSTextContainer以接受CGPath或坐标数组来创建要在其中绘制的文本容器所困扰 我的备份解决方案是使用核心文本在形状的中心坐标处绘制文本,但这将导致文本在某些形状
丹妮尔。这有点棘手。首先,您必须创建一个上下文。(bounds.size是图像的大小) 然后获取文本的边界框:(字体是您要使用的字体) 在上下文中绘制文本(x和y标记图像的中心) 获取图像
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
[yourText drawAtPoint:CGPointMake(x, y) withAttributes:@{NSFontAttributeName:font}];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
结束图像上下文
UIGraphicsEndImageContext();
我还没有测试过它,但这是一条路。Swift 2.0兼容 我的目的是画一个圆圈,里面有居中的文字
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)
}
}
使用此实用程序,我们可以通过以下方式轻松创建图像:
let font = UIFont()
let image = UIUtility.circleImageWithText(text: "Center text", font: font, circleColor: UIColor.blackColor())
我从这些答案和相关问题中挑选了一些答案——没有一个是真正令人满意的——并提出了一个简单的解决方案:
UIGraphicsBeginImageContext(CGSize.init(width: imageWidth, height: imageHeight))
let string = "ABC" as NSString
let attributes = [
NSFontAttributeName : UIFont.systemFontOfSize(40),
NSForegroundColorAttributeName : UIColor.redColor()
]
// 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()
结果(无论颜色如何):
Swift 3卢卡·达文佐答案的版本
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, textColor: textColor)
}
return nil
}
}
谢谢你的主意如果我在一个视图中画出多个中间形状的文本,这会起作用吗?当然UT会。如果使用cgcontextsavecgstate和cgcontextrestorecgstate,可以分别处理每个图形对不起,我想我遗漏了一些东西。为什么在这个例子中你得到了边界框?
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, textColor: textColor)
}
return nil
}
}