我正在开发一个barebones文本编辑器,遇到了一个问题。我在应用程序的顶部有两个按钮:粗体和斜体。虽然我已经想好了如何让这些按钮改变输入到文本视图中的文本,但它们会改变视图中写入的所有内容,包括已经写入的内容。因此;斜体";将斜体显示视图中的所有。我想要更多的";我在用斜体字——哦,很酷,我现在用斜体字写。现在我又打了一次——,又正常了">
我知道这个问题源于按钮改变了整个视图使用的字体,我只是想不出正确的方法。
到目前为止,这是我的代码:
@IBAction func italicizeHit(_ sender: Any) {
if isItalics == false {
textView.font = UIFont.italicSystemFont(ofSize: 15)}
else{
isItalics == false;
textView.font = UIFont.systemFont(ofSize: 15)
}
}
我也不太清楚如何将textView.font设置为使其恢复正常状态,但这是一个更次要的问题。我最感兴趣的是正确切换斜体。
这里的问题是textView.font
将textView的所有文本都设置为该属性。
为了实现多种样式,您需要使用NSAttributedString(它可以将粗体、斜体和常规文本存储在同一个字符串中(,而不仅仅是一个普通的string。
好消息是,textView可以很容易地使用NSAttributedString
而不是常规的String。要更改属性,请使用textView的typingAttributes
属性。这将更改任何新键入文本的样式,而不是整个文本视图的样式。这里有一个例子:
class ViewController: UIViewController {
let textView: UITextView // initialize textView either via storyboard or code
let attributesBold = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .bold)]
let attributesNormal = [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16, weight: .regular)]
override func viewDidLoad() {
textView.attributedText = NSAttributedString(string: "")
textView.typingAttributes = attributesNormal
}
@IBAction func boldTapped(_ sender: Any) {
textView.typingAttributes = attributesBold
}
}