Быстрое выделение событий выделения текста для UIWebView в приложении Cordova Ioni c - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время у меня есть приложение Cordova ioni c - angularjs, в котором я хочу заморозить прокрутку, пока пользователь выбирает текст (я включаю контекстное меню, следуя этому маленькому хаку )

Сейчас у меня есть собственный код Swift, захватывающий события UIMenuController.didShowMenuNotification и UIMenuController.didHideMenuNotification, который, в свою очередь, отправляет соответствующие javascript события документа для обработки веб-приложением и замораживает $ionicScrollDelegate, как показано ниже. Это прекрасно работает, и прокрутка останавливается при отображении контекстного меню, однако, если пользователь хочет расширить / сжать выделение, контекстное меню временно исчезает во время расширения / сжатия, которое размораживает представление прокрутки, пока контекстное меню не появится снова после пользователь поднимает палец. Можно ли получить диапазон выделенного текста вместо того, чтобы замораживать представление прокрутки в состоянии отображения контекстного меню, чтобы представление прокрутки было заморожено, пока текст не выделен?

CDVContextMenu .swift

@objc(CDVContextMenu)
class CDVContextMenu: CDVPlugin {

    typealias This = CDVContextMenu
    static var sharedCommandDelegate: CDVCommandDelegate?
    var contextMenuVisible = false

    override func pluginInitialize() {
        super.pluginInitialize()
        This.sharedCommandDelegate = commandDelegate
        NotificationCenter.default
            .addObserver(self,
                         selector: #selector(menuDidShow),
                         name: UIMenuController.didShowMenuNotification,
                         object: nil)
        NotificationCenter.default
            .addObserver(self,
                         selector: #selector(menuDidHide),
                         name: UIMenuController.didHideMenuNotification,
                         object: nil)
    }

    // MARK: - Event Handlers

    @objc
    func menuDidShow(_ notification: Notification) {
        This.sharedCommandDelegate?.evalJs("document.dispatchEvent(new Event('contextMenuDidShow'));")
        contextMenuVisible = true
    }

    @objc
    func menuDidHide(_ notification: Notification) {
        This.sharedCommandDelegate?.evalJs("document.dispatchEvent(new Event('contextMenuDidHide'));")
        contextMenuVisible = false
    }

}

index. js

document.addEventListener('contextMenuDidShow', function() {
  $ionicScrollDelegate.freezeScroll(true);
})

document.addEventListener('contextMenuDidHide', function() {
  $ionicScrollDelegate.freezeScroll(false);
})

1 Ответ

0 голосов
/ 14 февраля 2020

Я нашел решение, сделав это в javascript без необходимости в плагине:

document.addEventListener('selectionchange', function() {
    $ionicScrollDelegate.freezeScroll(true);
});
document.addEventListener('touchend', function() {
    $ionicScrollDelegate.freezeScroll(false);
})
...