修改 AttributedString 的文字內容

當我們使用 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")
}
}

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com