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

时间:2018-01-09 11:07:46

标签: ios swift uitextview styling uimenucontroller

当UITextView的allowEditingTextAttributes属性启用时,

textView.allowsEditingTextAttributes = true

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

UIMenuController - BIU Styling Options #1

UIMenuController - BIU Styling Options #2

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

BIU Styling Options in the native Notes app

有什么办法吗?我花了好几个小时来找到一种方法来覆盖"选择器((" _showTextStyleOptions:"))"但无法知道如何......请帮助我!!

2 个答案:

答案 0 :(得分:1)

当编辑菜单即将变为可见时,您会在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(_:))
}

根据文档,添加按钮后,您可能必须在update()上调用UIMenuController。但这对我而言不是必需的。

答案 1 :(得分:0)

根据文档,您可以通过UIMenuController的menuItems属性执行此操作。

  

您还可以通过menuItems属性提供自己的菜单项。修改菜单项时,可以使用update()方法强制菜单更新其显示。

link

  

每个菜单项都是UIMenuItem类的实例。您可以创建自己的菜单项,每个菜单项都有自己的标题和动作选择器,并通过此属性将它们添加到编辑菜单中。

link