如何在textview中从光标点开始改变字体样式,而不是整个textview-Swift



我正在开发一个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
}
}

最新更新