UILabel+Accent.swift
import UIKit
extension UILabel {
/// 対象の文字列に対して、アクセント色を付加する
///
/// - Parameters:
/// - pattern: 対象の文字列
/// - color: アクセント色
func addAccent(pattern: String, color: UIColor) {
// String
let strings = [attributedText?.string, text].flatMap { $0 }
guard let string = strings.first else { return }
// Ranges
let nsRanges = string.nsRanges(of: pattern, options: [.literal])
if nsRanges.count == 0 { return }
// Add Color
let attributedString = attributedText != nil
? NSMutableAttributedString(attributedString: attributedText!)
: NSMutableAttributedString(string: string)
for nsRange in nsRanges {
attributedString.addAttributes([.foregroundColor: color], range: nsRange)
}
// Set
attributedText = attributedString
}
}
String+Range.swift
import Foundation
extension String {
func nsRange(from range: Range<String.Index>) -> NSRange {
return NSRange(range, in: self)
}
func ranges(of searchString: String, options mask: NSString.CompareOptions = [], locale: Locale? = nil) -> [Range<String.Index>] {
var ranges: [Range<String.Index>] = []
while let range = range(of: searchString, options: mask, range: (ranges.last?.upperBound ?? startIndex)..<endIndex, locale: locale) {
ranges.append(range)
}
return ranges
}
func nsRanges(of searchString: String, options mask: NSString.CompareOptions = [], locale: Locale? = nil) -> [NSRange] {
let ranges = self.ranges(of: searchString, options: mask, locale: locale)
return ranges.map { nsRange(from: $0) }
}
}
使い方
let aLabel = UILabel()
aLabel.text = "あいうえお"
// "あいう"を赤色にする場合
aLabel.addAccent(pattern: "あいう", color: .red)
ワンポイント
- 対象の文字列が見つからなかった場合は、何もしないので安全です。
- テキスト装飾が既にあるラベルの場合は、引き継いだままアクセントを追加するようにしています。