You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在iOS 18中通过按钮点击触发UITextView的新格式面板?

如何在iOS 18中通过按钮点击触发UITextView的新格式面板?

好问题!我刚好研究过iOS 18这个新的格式面板功能,其实UIKit已经提供了专门的API来手动触发它,只是相关文档还没完全跟上WWDC的更新节奏。

你只需要修改工具栏按钮的响应方法,加上这几步就能实现:

  1. 先确保UITextView处于第一响应者状态(格式面板属于文本编辑交互的一部分,只有编辑状态下才能调出)
  2. 调用iOS 18新增的showTextFormattingPanel(from:sourceRect:)方法,指定面板弹出的源视图和位置,让交互符合系统逻辑
  3. 别忘了加版本兼容性检查,避免在旧系统上崩溃

修改后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:48:12