はじめに
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)
}
}
}