Как добавить распознаватель жестов в подкласс UIWebView?

Если я добавлю распознаватель жестов в экземпляр подкласса UIWebView с именем webView, например:

UILongPressGestureRecognizer *_longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(webViewGestureRecognized:)];
_longPressRecognizer.allowableMovement = 20;
_longPressRecognizer.minimumPressDuration = 1.0f;
[webView addGestureRecognizer:_longPressRecognizer];
[_longPressRecognizer release], _longPressRecognizer = nil; 

Селектор -webViewGestureRecognized: не вызывается при длительном нажатии.

Я переопределил метод делегата -gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, но селектор длительного нажатия по-прежнему не вызывается.

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

Могу ли я что-нибудь сделать, чтобы включить мой собственный распознаватель жестов в веб-представлении?


person Alex Reynolds    schedule 21.07.2010    source источник
comment
Вы решили эту проблему? Я также работаю над той же проблемой... Пожалуйста, помогите мне, если вы решили ее.   -  person Warrior    schedule 17.09.2010
comment
Меня устраивает. Пробовали ли вы не устанавливать allowableMovement и MinimumPressDuration ? Почему _longPressRecognizer = nil? Не ясно.   -  person Alex1987    schedule 24.01.2011
comment
Не могли бы вы опубликовать ответ, если вы решили эту проблему? Я тоже ищу такой же. Ваш ответ будет оценен.   -  person Easwaramoorthy K    schedule 03.07.2013
comment
попробуйте это: github.com/theniceboy/HoldToSaveImage   -  person David    schedule 18.11.2015


Ответы (3)


насколько я знаю, UIWebView не должен быть подклассом, как указано в документах Apple:

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html

person YNK    schedule 22.07.2010

Просто подумал, что добавлю ответ, если кто-нибудь вернется сюда. Вы не назначили делегата, поэтому gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: не вызывается.

_longPressRecognizer.delegate = self;

Сделайте это, и это сработает хорошо.

person DavidAWalsh    schedule 20.10.2011

Вы должны использовать javascript в UIWebView для обнаружения жестов. (Затем вы можете передать это обратно в Objective-C, если вам нужно.) Это Документация Apple по обнаружению жестов и касаний в Javascript. Я также нашел эту статью полезно, хотя он использует библиотеку javascript для работы с привязкой событий и т. д.

Вот рабочий пример масштабирования UIWebView, который стоит отдельно.

Обратите внимание, что это элемент body прослушивает событие. На короткой странице кажется, что это не поймать, если вы сделаете событие в огромном неотрисованном пробеле ниже. (Если кто-то знает об этом больше, пожалуйста, оставьте комментарий.)

<body id='body'>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 

<script type="text/javascript" charset="utf-8">

    body = document.getElementById('body');

    // (in percents)
    zoom = 100;
    maxZoom = 200;
    minZoom = 50;
    zoomIncrement = 25;

    function gestureEnd(event) {
        var newZoom;
        if (event.scale > 1.0) {
            // increase size
            newZoom = zoom + zoomIncrement;
        } else {
            // decrease size
            newZoom = zoom - zoomIncrement;
        }

        // don't exceed zoom boundaries
        if (newZoom > maxZoom || newZoom < minZoom) {
            return;
        }
        zoom = newZoom;
        body.style.webkitTextSizeAdjust = zoom+"%";
    }

    body.addEventListener("gestureend", gestureEnd, false);

    </script>
</body>
person zekel    schedule 02.09.2010
comment
У меня нет контроля над веб-контентом, поэтому это бесполезно для моего варианта использования. - person Alex Reynolds; 03.09.2010
comment
Не могли бы вы ввести тег <script>, чтобы включить свой собственный файл javascript? - person zekel; 13.01.2011
comment
@Alex Reynolds, вы можете просто позвонить [myWebView stringByEvaluatingJavaScriptFromString:javascriptString], чтобы ввести его. - person zekel; 15.04.2011