如何将多个样式添加到一个UITextView-例如iOS Notes App

时间:2018-07-19 16:06:16

标签: swift uitextview nsattributedstring nsrange nsmutableattributedstring

我想让用户通过选择范围和样式来设置具有多种样式的UITextView。为了简单起见,我有一个UITextView和2个UIButton(粗体和斜体),但是我想添加多种样式(颜色,大小,字体粗细等)。

var selectedRange: NSRange?
@IBOutlet weak var textBox: UITextView!

let boldAttribute = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22, weight: .bold)]
let italicAttribute = [NSAttributedStringKey.font: UIFont.italicSystemFont(ofSize: 15)]

@IBAction func pressedItalic(_ sender: UIButton) {
    if selectedRange != nil {
        let string = NSMutableAttributedString(string: textBox.text)
        string.addAttributes(italicAttribute, range: selectedRange!)
        textBox.attributedText = string
    }
}


@IBAction func pressedBold(_ sender: UIButton) {
    if selectedRange != nil {
        let string = NSMutableAttributedString(string: textBox.text)
        string.addAttributes(boldAttribute, range: selectedRange!)
        textBox.attributedText = string
    }
}


override func viewDidLoad() {
    super.viewDidLoad()
    textBox.delegate = self
}


func textViewDidChangeSelection(_ textView: UITextView) {
    selectedRange = textView.selectedRange
    print(selectedRange)

}

问题:选择新样式时,先前的选择和所选样式会恢复为默认样式。如何在一个文本视图中添加多种不同样式,而无需每次都刷新呢?我的最终目标是构建类似于预构建的iOS笔记应用程序,使用户可以完全自定义文本的样式和布局。

更新:

我想一直向用户显示控件(按钮)。使用UIMenuController也可以吗?

编辑:

我希望能够控制所有样式(颜色,字体粗细,大小等)

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用glutInit()协议中的方法,而不是自己突变字符串。该协议已经附加到UITextView,并提供对用户可用的所有文本编辑功能的访问,包括func main() { var argc: Int32 = 0 //<- 0 glutInit(&argc, nil) //... } UIResponderStandardEditActions。这些允许多种不同的样式来操纵文本。您可以在textview上调用它们:

toggleBoldFace()

请参阅:Apple's Developer Documentation on UIResponderStandardEditActions

答案 1 :(得分:0)

我最终解决了这个问题,即在ViewDidLoad上声明了NSMutableAttributedString

var string: NSMutableAttributedString?

override func viewDidLoad() {
    super.viewDidLoad()
    string = NSMutableAttributedString(string: textBox.text)
}

然后在每个动作中对该字符串使用beginEditing()和endEditing()方法。

@IBAction func pressedItalic(_ sender: UIButton) {
    if selectedRange != nil {
        string?.beginEditing()
        string?.addAttributes(italicAttribute, range: selectedRange!)
        textBox.attributedText = string
        string?.endEditing()
    }
}

这样,我可以向字符串顺序添加无尽的样式属性(大小,颜色,粗细等)。