2014-01-21 5 views
3

Я пытаюсь нарисовать текст в центре формы в прошивке, пример может служить Microsoft Office в форме вставки см: https://www.dropbox.com/s/cgqyyuvy6hcv5g8/Screenshot%202014-01-21%2013.48.17.pngтекст IOS Рисования в центре формы

У меня есть массив координат, которые используются чтобы сформировать форму, которая отлично подходит для создания реальной формы.

Моя первая тактика следовала за этим вопросом stackoverflow: Core Text With Asymmetric Shape on iOS Однако я могу получить его, чтобы нарисовать текст в нижней части формы. Есть ли способ центрировать текст по вертикали и по горизонтали?

Я тогда посмотрел на новый TextKit, но я застрял в подклассе NSTextContainer, чтобы принять либо CGPath, либо массив координат, чтобы создать текстовый контейнер для рисования внутри.

Мое резервное решение состоит в том, чтобы использовать Core Text для рисования текста в центральной координате фигуры, однако это приведет к тому, что текст будет рисоваться вне формы на некоторых фигурах, таких как прямоугольный треугольный треугольник.

В качестве альтернативы, есть ли какие-либо другие методы, которые я мог бы использовать для получения некоторого текста в центре фигуры?

Спасибо,

Danielle.

ответ

4

Это немного сложно. Сначала вам нужно создать контекст. (Bounds.size является размером изображения)

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

Затем получить ограничительную рамку текста: (шрифт шрифта, который вы хотите использовать)

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

нарисовать текст в контекст (х и у отмечает центр изображения)

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

Получить изображение

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

Конец контекста изображения

UIGraphicsEndImageContext(); 

Я не проверял, но это путь.

+1

Спасибо за идею! - будет ли это работать, если я рисую несколько фигур с текстом в середине в drawRect в одном представлении? – Danielle

+0

Конечно, будет. Вы можете обрабатывать каждый рисунок отдельно, если вы используете cgcontextsavecgstate и cgcontextrestorecgstate –

+1

извините, я думаю, что у меня что-то не хватает. Почему в этом примере вы получили ограничительную рамку? –

3

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()) 
+1

вы спасатель жизни ... Благословит вас Бог – user578386

9

Я cherrypicked из этих ответов и от связанных с этим вопросов - ни один из них не был по-настоящему удовлетворение - и пришло это простое решение:

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

Результат (nevermind the co lours):

String ABC centered in image

4

Swift 3 версия ответа Luca ДаВанзо в

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 
} 
} 
Смежные вопросы