Edited at

NSAttributedStringのお手軽Extension

More than 1 year has passed since last update.


はじめに

UILabelの行間を調整したり、見た目をカスタムするときによくお世話になるNSAttributedStringですが、指定するKeyをよく忘れるし、指定方法が面倒なのでお手軽Extensionにしてみました。


実装

行間調整などについてはNSParagraphStyleなので、Extensionはそれぞれ追加しました。

メソッドチェーンで繋げて書けるようにしてあります。

public extension NSMutableAttributedString {

public func setFont(font : UIFont, range : NSRange) -> Self{
addAttribute(NSFontAttributeName, value: font, range: range)
return self
}

public func setTextColor(color : UIColor, range : NSRange) -> Self {
addAttribute(NSForegroundColorAttributeName, value: color, range: range)
return self
}

public func setBaseLineOffset(offset : CGFloat, range : NSRange) -> Self {
addAttribute(NSBaselineOffsetAttributeName, value: offset, range: range)
return self
}

public func setLetterSpacing(letterSpacing : CGFloat, range : NSRange) -> Self {
addAttribute(NSKernAttributeName, value: letterSpacing, range: range)
return self
}

public func setParagraphStyle(style : NSParagraphStyle, range : NSRange) -> Self {
addAttribute(NSParagraphStyleAttributeName, value: style, range: range)
return self
}
}

public extension NSMutableParagraphStyle {
public func setLineHeight(min min : CGFloat, max : CGFloat) -> Self {
self.minimumLineHeight = min
self.maximumLineHeight = max
return self
}

public func setTextAlignment(alignment : NSTextAlignment) -> Self {
self.alignment = alignment
return self
}

public func setLineBreak(lineBreakMode : NSLineBreakMode) -> Self {
self.lineBreakMode = lineBreakMode
return self
}

public func setLineSpace(lineSpacing : CGFloat) -> Self {
self.lineSpacing = lineSpacing
return self
}
}


使用例

下記のようにすっきり書けました。

let string = "テスト"

let attributedString = NSMutableAttributedString(string: string)
.setFont(14, range: NSMakeRange(0, string.length))
.setLetterSpacing(2.0, range: NSMakeRange(0, string.length))
.setParagraphStyle(NSMutableParagraphStyle()
.setLineHeight(min:20.0, max:20.0)
.setTextAlignment(.Center), range: NSMakeRange(0, string.length))
label.attributedText = attributedString


おまけ

UILabelでラベルの高さを取得したい場合はboundingRectWithSizeをよく使用しますが、AttributedTextで高さを取得したい場合のUILabelのextensionです。

public extension UILabel {

public var attributedLabelFrame : CGRect {
get {
guard let attributedText = self.attributedText else {
return .zero
}
return attributedText.boundingRectWithSize(CGSizeMake(self.frame.width, self.frame.height), options: .UsesLineFragmentOrigin, context: nil)
}
}
}