如何在iOS 18中通过按钮点击触发UITextView的新格式面板?
如何在iOS 18中通过按钮点击触发UITextView的新格式面板?
好问题!我刚好研究过iOS 18这个新的格式面板功能,其实UIKit已经提供了专门的API来手动触发它,只是相关文档还没完全跟上WWDC的更新节奏。
你只需要修改工具栏按钮的响应方法,加上这几步就能实现:
- 先确保UITextView处于第一响应者状态(格式面板属于文本编辑交互的一部分,只有编辑状态下才能调出)
- 调用iOS 18新增的
showTextFormattingPanel(from:sourceRect:)方法,指定面板弹出的源视图和位置,让交互符合系统逻辑 - 别忘了加版本兼容性检查,避免在旧系统上崩溃
修改后的UITextView扩展代码如下:
extension UITextView { func addToolbar() { let toolbar = UIToolbar() let formatButton = UIBarButtonItem( image: UIImage(systemName: "textformat.alt"), style: .plain, target: self, action: #selector(showTextFormattingPanel) ) toolbar.items = [formatButton] self.inputAccessoryView = toolbar } @objc private func showTextFormattingPanel() { guard #available(iOS 18.0, *) else { // iOS 18以下可以提示用户或做兼容处理 print("格式面板仅支持iOS 18及以上版本") return } // 确保textView处于编辑状态 becomeFirstResponder() // 获取格式按钮的视图和位置,让面板从按钮附近弹出 guard let formatButton = inputAccessoryView?.items?.first(where: { $0.action == #selector(showTextFormattingPanel) }) as? UIBarButtonItem, let buttonView = formatButton.value(forKey: "view") as? UIView else { return } let sourceRect = buttonView.frame showTextFormattingPanel(from: inputAccessoryView!, sourceRect: sourceRect) } }
几点说明:
becomeFirstResponder()是关键:如果你的textView之前没有处于编辑状态,调用这个方法会激活键盘(同时调出格式面板);如果已经是第一响应者,这个方法不会有任何副作用。- 关于弹出位置:通过获取按钮的实际视图和frame,能让格式面板从按钮的位置附近弹出,和系统默认的交互体验保持一致,用户会更习惯。
- 版本检查:一定要加上
#available(iOS 18.0, *),否则在iOS 17及以下的设备上运行会直接崩溃。
这样修改后,点击工具栏上的格式按钮就能直接调出WWDC24介绍的那个新格式面板啦!
备注:内容来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

