如何在SwiftUI中添加一键唤起Format面板的键盘工具栏按钮
实现点击键盘工具栏按钮直接唤起Format面板
要实现类似Apple Notes的一键唤起Format面板功能,核心是利用UITextView的showTextStyleOptions(_:)方法,直接调出系统格式面板,无需经过「更多」步骤。以下是优化后的完整代码:
修改后的ViewController代码
import UIKit import SwiftUI class ViewController: UIViewController { var text: String = "Implementing a Rich Text Editor has become a nightmare for iOS developers so far. Finally Apple announced an exciting update to UITextView for rich text editing." weak var textView: UITextView! override func viewDidLoad() { super.viewDidLoad() setupTextView() setupKeyboardToolbar() } private func setupTextView() { let textView = UITextView(frame: view.bounds.inset(by: UIEdgeInsets(top: 20, left: 16, bottom: 20, right: 16))) textView.font = .systemFont(ofSize: 21) textView.borderStyle = .none textView.allowsEditingTextAttributes = true textView.text = text view.addSubview(textView) self.textView = textView } private func setupKeyboardToolbar() { let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44)) toolbar.barStyle = .default let formatButton = UIBarButtonItem(title: "格式", style: .plain, target: self, action: #selector(showFormatPanel)) let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) toolbar.items = [flexibleSpace, formatButton, flexibleSpace] toolbar.sizeToFit() textView.inputAccessoryView = toolbar } @objc private func showFormatPanel() { // 直接唤起系统Format面板 textView.showTextStyleOptions(.init()) } func updateTextView(text: String) { textView.text = text } } #Preview { ViewController() }
关键说明
- 键盘工具栏设置:通过
setupKeyboardToolbar创建包含「格式」按钮的工具栏,并将其设为textView的inputAccessoryView,使其随键盘一起显示 - 直接唤起格式面板:点击按钮时调用
textView.showTextStyleOptions(_:),这是iOS 16+提供的API,可直接调出系统格式面板,跳过默认的「更多」步骤 - 前提条件:必须确保
textView.allowsEditingTextAttributes设为true,否则无法启用富文本编辑及格式面板功能
保留原SimpleTextView代码
import SwiftUI import UIKit struct SimpleTextView: UIViewControllerRepresentable { @Binding var text: String func makeUIViewController(context: Context) -> ViewController { let viewController = ViewController() viewController.text = text return viewController } func updateUIViewController(_ uiViewController: ViewController, context: Context) { uiViewController.updateTextView(text: text) } }
内容的提问来源于stack exchange,提问作者Lion
相关产品推荐
相关产品推荐

