修改 AttributedString 的文字內容
Published in
Nov 11, 2021
當我們使用 iOS 15 的 UIButton.Configuration 設定 button 樣式時,我們可以透過 AttributedString 設定文字的樣式,比方下圖設定 Style 為 Filled,然後設定字型,文字顏色和背景顏色。
剛剛畫面的 button 從程式設定的方法如下。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let button = UIButton()
var config = UIButton.Configuration.filled()
var title = AttributedString("button")
title.font = UIFont(name: "MarkerFelt-Thin", size: 24)
config.attributedTitle = title
config.baseForegroundColor = .systemYellow
config.baseBackgroundColor = .systemGreen
button.configuration = config
button.sizeToFit()
view.addSubview(button)
}
}
若想修改 button 文字內容,比方在 button 點選時將文字反轉,將文字從 button 改成 nottub,則要特別注意以下問題。
呼叫 setTitle(_:for:) 可以修改文字,但文字的字型會無法維持原本的樣式。
button.setTitle("nottub", for: .normal)
若想維持字型,有以下兩種方法。
- 方法 1: 設定 button 的 configuration?.attributedTitle?.characters,用 AttributedString.CharacterView 設定新的文字內容。
@IBAction func tap(_ sender: UIButton) {
sender.configuration?.attributedTitle?.characters = AttributedString.CharacterView("nottub")
}
- 方法 2: 找出原本文字的 range,然後呼叫 replaceSubrange 取代原本的文字。
@IBAction func tap(_ sender: UIButton) {
if let attributedTitle = sender.configuration?.attributedTitle,
let range = attributedTitle.range(of: String(attributedTitle.characters)) {
sender.configuration?.attributedTitle?.characters.replaceSubrange(range, with: "nottub")
}
}