LoginSignup
7
7

More than 5 years have passed since last update.

NSAttributedStringのお手軽Extension

Last updated at Posted at 2016-12-03

はじめに

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)
        }
    }
}
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7