WKWebView и UIMenuController

У меня есть приложение с WKWebView. В этом приложении я настраиваю параметры, представленные в файле UIMenuController. Веб-представление, кажется, добавляет в меню параметры «Копировать» и «Определить», независимо от того, что я делаю. Если я назначу себя первым ответившим и верну NO для всего, я все равно получу варианты копирования и определения. И я реализовал свой собственный вариант копирования, который делает особые вещи в зависимости от предпочтений пользователя и того, что именно выбрано. Есть ли способ удалить эти дополнительные параметры?

Обновление: я зарегистрировал это как радар 18487289.


person Tom Hamming    schedule 25.09.2014    source источник
comment
У меня такая же проблема, есть прогресс?   -  person avdyushin    schedule 08.06.2015
comment
@avdyushin нет. Но я на WWDC. На неделе спрошу у кого-нибудь.   -  person Tom Hamming    schedule 08.06.2015
comment
@avdyushin это известная проблема, но нет графика. Полное исправление на данный момент состоит в том, чтобы скрыть меню на willShow и создать и представить свое собственное с любыми параметрами, которые вы хотите.   -  person Tom Hamming    schedule 15.06.2015
comment
Спасибо, воспользуюсь UIMenuControllerWillShowMenuNotification уведомлением...   -  person avdyushin    schedule 16.06.2015
comment
Привет, ребята, есть новости по этому поводу? Я пытаюсь вызвать menuVisible=NO UIMenuControllerWillShowMenuNotification, но он не скрывает меню копирования/определения/совместного использования по умолчанию...   -  person mkto    schedule 06.10.2015
comment
Не могли бы вы рассказать подробнее о марке и представить свою часть вашей текущей работы? Вы имеете в виду создание собственного меню с нуля? Как-то управлять UIMenuController самостоятельно? Или использовать что-то вроде QBPopupMenu (github.com/questbeat/QBPopupMenu)? Копия: @avdyushin   -  person davew    schedule 20.10.2015
comment
Я использую QBPopupMenu. В WillShow я создал фиктивное представление за пределами экрана и установил целевой прямоугольник для UIMenuController в этом представлении. (Это скроет системное меню). Затем покажите QBPopupMenu на DidShow, где я хочу.   -  person avdyushin    schedule 26.10.2015
comment
Проверьте мой ответ в здесь, вы можете получить кадр UIMenuController и реализовать свое представление после того, как исходный UIMenuController исчезнет.   -  person ysnzlcn    schedule 28.02.2017
comment
@davew проблема, похоже, решена в iOS 13.   -  person Tom Hamming    schedule 10.06.2019


Ответы (2)


Для iOS 11 просто создайте подкласс WKWebView и переопределите canPerformAction, чтобы вернуть false:

class WebView : WKWebView {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

Для iOS 10 или более ранней версии используйте метод canPerformAction для WKContentView:

@objc private extension UIResponder {
    func swizzle_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
}

guard let viewClass = NSClassFromString("WKContentView") as? UIView.Type else { return }
method_exchangeImplementations(
    class_getInstanceMethod(viewClass, #selector(UIResponder.canPerformAction))!,
    class_getInstanceMethod(UIResponder.self, #selector(UIResponder.swizzle_canPerformAction))!
)

После удаления встроенных элементов меню этого веб-представления вы можете добавить свои пользовательские элементы меню с помощью UIMenuController.shared, как обычно.

person Jonny    schedule 05.12.2017

Похоже, это исправлено в iOS 13 beta 1.

person Tom Hamming    schedule 10.06.2019