Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - Drawing text with drawInRect:withAttributes:

Tags:

swift

I have strange problem with Xcode 6.1 GM.

let text: NSString = "A"
let font = NSFont(name: "Helvetica Bold", size: 14.0)

let textRect: NSRect = NSMakeRect(5, 3, 125, 18)
let textStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as NSMutableParagraphStyle
textStyle.alignment = NSTextAlignment.LeftTextAlignment
let textColor = NSColor(calibratedRed: 0.147, green: 0.222, blue: 0.162, alpha: 1.0)

let textFontAttributes = [
    NSFontAttributeName: font,
    NSForegroundColorAttributeName: textColor,
    NSParagraphStyleAttributeName: textStyle
]

text.drawInRect(NSOffsetRect(textRect, 0, 1), withAttributes: textFontAttributes)

Error is in line let texFontAttributes...

Cannot convert the expression's type 'Dictionary' to type 'DictionaryLiteralConvertible'

This code is worked perfectly until Xcode 6.1 GM.

When I'm tried to declare textFontAttributes as NSDictionary error message is changed to:

Cannot convert the expression's type 'NSDictionary' to type 'NSString!'

I have no idea how to solve this problem :(

like image 887
iPera Avatar asked Oct 05 '14 10:10

iPera


3 Answers

The problem is that font is optional because the convenience contructors now return optional values, so font needs to be unwrapped to be a value in your dictionary:

if let actualFont = font {
    let textFontAttributes = [
        NSFontAttributeName: actualFont,
        NSForegroundColorAttributeName: textColor,
        NSParagraphStyleAttributeName: textStyle
    ]

    text.drawInRect(NSOffsetRect(textRect, 0, 1), withAttributes: textFontAttributes)
}
like image 139
vacawama Avatar answered Nov 04 '22 08:11

vacawama


In Swift 4

    let attributeDict: [NSAttributedString.Key : Any] = [
        .font: font!,
        .foregroundColor: textColor,
        .paragraphStyle: textStyle,
    ]

    text.draw(in: rect, withAttributes: attributeDict)
like image 8
AechoLiu Avatar answered Nov 04 '22 08:11

AechoLiu


This is also another option.

let textFontAttributes = [
    NSFontAttributeName : font!,
    NSForegroundColorAttributeName: textColor,
    NSParagraphStyleAttributeName: textStyle
]
like image 2
Randall Sutton Avatar answered Nov 04 '22 09:11

Randall Sutton