我想让用户通过选择范围和样式来设置具有多种样式的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也可以吗?
编辑:
我希望能够控制所有样式(颜色,字体粗细,大小等)
谢谢!
答案 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()
}
}
这样,我可以向字符串顺序添加无尽的样式属性(大小,颜色,粗细等)。