2014-09-03 11 views
7

Ich versuche, ein Unicode-Symbol in einem UIBarButtonItem Titel zu verwenden, aber Ändern der Etikettengröße macht es vertikal zu hoch, und es ist offensichtlich aus der Mitte.UIBarButtonItem Titel Offset

ergh

-Code derzeit verwendet werden:

let fontDict = [NSFontAttributeName: UIFont.systemFontOfSize(30.0)] 
editButton.title = "✎" 
editButton.setTitleTextAttributes(fontDict, forState: UIControlState.Normal) 

Ich habe versucht, das Hinzufügen eines Offset, aber es scheint nicht, etwas zu tun.

editButton.setTitlePositionAdjustment(UIOffsetMake(0, -10.0), forBarMetrics: UIBarMetrics.Default) 

Antwort

8

Ich hatte ein ähnliches Problem, und die beste Option war ich bisher fand eine UIImage aus dem Text zu erstellen (eine weiße Textfarbe verwendet wird) und dann meine UIBarButtonItem mit dem Bild erstellen. Die weiße Farbe wird durch die Standardfarbe ersetzt und zentriert das Bild vertikal ziemlich gut.

Ich fand die Methode zum Konvertieren von Text in ein Bild in Antworten auf this SO question. Ich Setup dann die UIBarButtonItem mit diesem Code (in Swift):

let settingsImage = imageFromText("\u{2699}", font: UIFont(name: "Helvetica", size: 34.0)!, maxWidth: 1000, color:UIColor.whiteColor()); 
let settingsButton = UIBarButtonItem(image: settingsImage, style: UIBarButtonItemStyle.Plain, target: self, action: "showSettings"); 

HINWEIS: die imageFromText Funktion in den SO Antworten oben Bezug genommen wurde gefunden, aber ich werde es (und eine entsprechende Funktion) sind hier der Einfachheit halber mit swift:

class func sizeOfAttributeString(str: NSAttributedString, maxWidth: CGFloat) -> CGSize { 
    let size = str.boundingRectWithSize(CGSizeMake(maxWidth, 1000), options:(NSStringDrawingOptions.UsesLineFragmentOrigin), context:nil).size 
    return size 
} 

class func imageFromText(text:NSString, font:UIFont, maxWidth:CGFloat, color:UIColor) -> UIImage 
{ 
    let paragraph = NSMutableParagraphStyle() 
    paragraph.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    paragraph.alignment = .Center // potentially this can be an input param too, but i guess in most use cases we want center align 

    let attributedString = NSAttributedString(string: text, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: color, NSParagraphStyleAttributeName:paragraph]) 

    let size = sizeOfAttributeString(attributedString, maxWidth: maxWidth) 
    UIGraphicsBeginImageContextWithOptions(size, false , 0.0) 
    attributedString.drawInRect(CGRectMake(0, 0, size.width, size.height)) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
}