如何向 UITextView 的 UIMenuController 添加更多样式选项?

Jae*_*Lee 3 styling uitextview uimenucontroller ios swift

当UITextView的allowsEditingTextAttributes属性启用时,

textView.allowsEditingTextAttributes = true
Run Code Online (Sandbox Code Playgroud)

textview 可以通过 UIMenuController 在上下文菜单中显示 BIU(粗体/斜体/下划线)样式选项。

UIMenuController - BIU 样式选项 #1

UIMenuController - BIU 样式选项 #2

我想知道如何向 BIU 内的上下文菜单添加更多样式选项(例如,删除线、突出显示)。例如,iOS 的本机 Notes 应用程序在样式菜单中有四个选项(BIU + 删除线)。

本机 Notes 应用程序中的 BIU 样式选项

有什么办法可以做到吗?我花了几个小时寻找一种覆盖“Selector(("_showTextStyleOptions:"))”的方法,但找不到如何操作..请帮助我!

Fel*_*lix 5

当编辑菜单即将变得可见时,您会canPerformAction(_:withSender:)在 UITextView 中收到一个调用。当用户选择菜单中的按钮时,会再次调用此方法。您可以检查是否选择了字体样式按钮并向该子菜单添加自定义按钮。

class MyTextView: UITextView {

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        let menuController = UIMenuController.shared
        if var menuItems = menuController.menuItems,
            (menuItems.map { $0.action }).elementsEqual([.toggleBoldface, .toggleItalics, .toggleUnderline]) {
            // The font style menu is about to become visible
            // Add a new menu item for strikethrough style
            menuItems.append(UIMenuItem(title: "Strikethrough", action: .toggleStrikethrough))
            menuController.menuItems = menuItems
        }
        return super.canPerformAction(action, withSender: sender)
    }

    @objc func toggleStrikethrough(_ sender: Any?) {
        print("Strikethrough button was pressed")
    }

}

fileprivate extension Selector {
    static let toggleBoldface = #selector(MyTextView.toggleBoldface(_:))
    static let toggleItalics = #selector(MyTextView.toggleItalics(_:))
    static let toggleUnderline = #selector(MyTextView.toggleUnderline(_:))
    static let toggleStrikethrough = #selector(MyTextView.toggleStrikethrough(_:))
}
Run Code Online (Sandbox Code Playgroud)

根据文档,您可能需要在添加按钮后update()调用。UIMenuController但在我的情况下这是没有必要的。