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

3

当UITextView的allowsEditingTextAttributes属性启用时,

textView.allowsEditingTextAttributes = true

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

UIMenuController - BIU样式选项#1

UIMenuController - BIU样式选项#2

我想知道如何在BIU内添加更多样式选项(例如删除线,高亮)。例如,iOS的原生Notes应用程序在样式菜单中有四个选项(BIU +删除线)。

原生笔记应用程序中的BIU样式选项

有没有办法做到这一点? 我已经花了几个小时查找覆盖“Selector((“_showTextStyleOptions:”))”的方法,但没有找到如何做...请帮帮我!

1个回答

5
当编辑菜单即将显示时,在UITextView中会调用canPerformAction(_:withSender:)方法。当用户在菜单中选择按钮时,该方法会再次被调用。您可以检查是否选择了字体样式按钮,并向子菜单添加自定义按钮。
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(_:))
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接