Жест прокрутки назад/вперед в WebViews

Я просмотрел еще один пост здесь, в Stack Overflow, о жесте «назад», но мой немного отличается.

Как я могу реализовать жест смахивания для перехода «Назад» и «Вперед», чтобы повлиять на WebView, когда курсор закончился? Например, если их несколько, жест переходит к соответствующему виду и влияет на него.

Я предполагаю, что это будет следующий код, но я не знаю, как заставить работать методы жестов:

- (void) backGesture {
    [(WebView *)self.theWebView goBack];
}

- (void) forwardGesture {
    [(WebView *)self.theWebView goForward];
}

Где «theWebView» — это WebView, над которым находится курсор.

Это вообще возможно?


person Cristian    schedule 02.05.2012    source источник
comment
Вы можете попробовать использовать файл UISwipeGestureRecognizer. Узнать координаты касаний можно при вызове целевого метода.   -  person jessecurry    schedule 02.05.2012
comment
Как я обнаружил ниже, на самом деле это вопрос OS/X, поэтому я добавил этот тег.   -  person mackworth    schedule 04.05.2012


Ответы (3)


Что ж, вы можете добавить категорию в webView с помощью метода swipeWithEvent, чтобы каждое представление обрабатывало свое собственное смахивание (разновидность трех пальцев; прокрутка двумя пальцами преобразуется в действия мыши для веб-просмотра).

WebView+addSwipe.h:

#import <WebKit/WebKit.h>
@interface WebView (addSwipe)
@end

WebView+addSwipe.m:

#import "WebView+addSwipe.h"

@implementation WebView (addSwipe)

- (void)swipeWithEvent:(NSEvent *)event {
    CGFloat deltaX = [event deltaX];
    if (deltaX > 0) {
        NSLog(@"goForward %@ ", self);
        [self goForward];
    } else if (deltaX < 0) {
        NSLog(@"goBack%@ ", self);
        [self goBack];
    }
}

@end

И, если вы БЫЛИ на iOS, прикрепите два UISwipeGestureRecognizer к каждому представлению; по одному для каждого направления с отдельными действиями:

-(void) backGesture:(UIGestureRecognizer *)sender {
    [sender.view goBack];
}

-(void) forwardGesture:(UIGestureRecognizer *) sender)
    [sender.view goForward];
}

с вашим viewController в качестве цели. Каждое действие жеста будет передано отправителю, поэтому sender.view сообщит вам, в каком представлении было пролистывание.

Обратите внимание, что «Проведение тремя пальцами для навигации» должно быть включено на панели управления трекпада в системе, в которой работает ваша программа.

person mackworth    schedule 02.05.2012
comment
Итак, отправитель — это то, что я буду использовать для идентификации WebView, однако ваше решение предназначено для iOS, я разрабатываю для Mac :), есть идеи? - person Cristian; 02.05.2012
comment
Ах, извините за это. Поможет ли исправленная версия? - person mackworth; 03.05.2012
comment
скоро посмотрю, здесь уже поздно ;) Еще раз спасибо! - person Cristian; 03.05.2012
comment
Я не понимаю, как я определяю [местоположение событияInWindow], есть идеи? - person Cristian; 03.05.2012
comment
Что ж, это возвращается к базовому (одному виду) случаю), например. Документ Apple по обработке событий трекпада. Если вы реализуете - (void)swipeWithEvent:(NSEvent *)event, то событие определено для вас и имеет метод locationInWindow. Я сделал это в коде выше. - person mackworth; 04.05.2012
comment
кажется, что ваш код должен работать, я должен делать что-то не так, но он просто ничего не делает, даже базовый NSLog() внутри этого метода не срабатывает, когда я делаю жест назад/вперед. - person Cristian; 04.05.2012
comment
Вы установили acceptsFirstResponder:YES и acceptsTouchEvents:YES - person mackworth; 04.05.2012
comment
таких вариантов я еще не видел! где я могу их найти? вы меня так многому научили, лол, спасибо :) - person Cristian; 04.05.2012
comment
Что ж, я решил попробовать и обнаружил, что это не обязательно, но кажется, что свайпы вообще не передаются в viewController, поэтому я переключился на категорию Webview. См. выше исправленную версию. Обратите внимание, что на панели управления трекпада должно быть включено смахивание тремя пальцами для навигации. - person mackworth; 05.05.2012
comment
Рад помочь; получилось довольно просто и полезно. Я полагаю, это сработало для вас? - person mackworth; 06.05.2012

Вы можете создавать свои собственные пользовательские жесты, но вы должны реализовать касания, начиная, перемещая касания и заканчивая касаниями. Лучшим способом было бы иметь CGPoint с именем startPoint и второй CGPoint с именем endPoint. Когда касания начались, вы сохраняете местоположение касания в startPoint. В завершенных касаниях вы сохраняете конечную точку в endPoint. Чтобы увидеть, был ли это удар назад, сравните значения x двух точек! Вот ссылка на получение касаний: http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-detecting-touches/
Надеюсь, это помогло!

person waylonion    schedule 02.05.2012

Чтобы провести пальцем двумя пальцами, перейдите на страницу https://github.com/Kapeli/SwipableWebView.

person bogdansrc    schedule 23.12.2012