元柔道整復師エンジニアBlog

- 元柔道整復師エンジニアBlog -

『 エンジニアをリングする。』

【Swift】UILabelで単位部分(◯秒・◯cm)の一部文字サイズを変更したい

UILabelとかで「10秒」や「10cm」といった、
ある単位を含む文字を表示させたい場合において、その単位部分のみ文字サイズを小さく表示させたいということがある。
→「〇〇」「〇〇cm」など

そのUILabelを一箇所でしか使用しない場合であれば、
以下のように直接Attributeで一部サイズを変更すれば問題なさそう。

しかし、
・複数箇所で使用する場合
・「10秒」「20秒」「30秒」といった値が可変する場合
・「10秒」「10cm」「10kg」といった単位が可変する場合
などでは上記の方法は現実的ではない....

そこでUILabelを拡張して、
上記の条件でも単位部分の文字サイズを変更できるようにしてみた。 ここでは、単位サイズを値の半サイズで表示させている。

Swift4

extension UILabel {
    func addUinit(unit: String, size: CGFloat) {
        guard let label = self.text else {
            return
        }
        // 単位との間隔
        let mainString = NSMutableAttributedString(string: label + " ")
        let unitString = NSMutableAttributedString(
            string: unit,
            attributes: [.font: UIFont.systemFont(ofSize: size)])
        let attributedString = NSMutableAttributedString()
        attributedString.append(mainString)
        attributedString.append(unitString)
        
        self.attributedText = attributedString
    }
}

// cm
label1.text = "10"
label1.addUinit(unit: "cm", size: label1.font.pointSize / 2)
print(label1.text!) // 10 cm

// 秒
label2.text = "60"
label2.addUinit(unit: "秒", size: label2.font.pointSize / 2)
print(label2.text!) // 60 秒

Swift3

Swift3では、 .font: UIFont.systemFont(ofSize: size)部分がNSAttributedString.Key.font : UIFont.systemFont(ofSize: size)になりそう。

参考