Распознавание жестов с помощью UIWebView - PullRequest
11 голосов
/ 16 июня 2011

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

Можно ли обнаружить нажатие, которое не было нажатием на ссылку?Могу ли я сделать это, увидев, где произошло касание, и принять меры только в том случае, если оно не произошло по ссылке html?Если это возможно, будет полезен указатель на то, как определить, была ли ссылка нажата.

В соответствии с предложением Octys, я пытался обернуть UIWebView внутри UIView.Я использую интерфейсный конструктор, поэтому я вставил представление в иерархию и сделал UIWebView «потомком» нового UIView.Теперь иерархия выглядит следующим образом:

Hierarchy screen shot

Я добавил IBOutlet для представления в моем контроллере представления и связал его в конструкторе интерфейса.

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

UITapGestureRecognizer* singleTap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap:)];
singleTap.numberOfTouchesRequired=1;
singleTap.delegate=self;
[self.UIWebViewContainer addGestureRecognizer:singleTap];
[singleTap release];

Этот код находится в viewDidLoad.

Как и прежде, код правильно видит одно касание пальцем, но нажатие на ссылку вUIWebView также вызывает исчезновение панели инструментов.Я хочу, чтобы панель инструментов исчезла, если ссылка НЕ ​​была нажата.

У кого-нибудь есть предложения?

Спасибо.

Крис

Спасибо, Крис

Ответы [ 6 ]

10 голосов
/ 16 июня 2011

Попробуйте обернуть UIWebView в контейнер UIView и установить распознаватели жестов в представлении контейнера.События касания, которые не обрабатываются UIWebView, будут передаваться вверх по иерархии представления и перехватываться вашим контейнерным представлением, предполагая, что оно реализует соответствующие обработчики (и именно эти обработчики должны реализовывать код для скрытия панелей инструментов ...).

3 голосов
/ 20 декабря 2011

ОК, поэтому один из обходных путей заключается в том, чтобы сделать контроллер представления, в котором находится UIWebView, делегатом распознавателя жестов, который вы создаете (UIGestureRecognizerDelegate). Обычно я не фанат таких решений, как этот, но ...

Присвойте распознаватель жестов представлению, которое оборачивает ваше веб-представление, и установите для его делегата значение self.

, затем в методе делегата gestRecognizer: shouldRecieveTouch установите состояние, чтобы указатьбыло событием касания,

Вернуть NO из метода делегата, чтобы событие распространялось вниз по цепочке респондента в UIWebView.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{

    _userTapped = YES;
    [self performSelectorOnMainThread:@selector(hideMenuIfNotLink) afterDelay:??.?];
//??.?? amount of time to lapse to see if shouldStartLoadWithRequest gets called.
   return NO;

}

-(void)hideMenuIfNotLink{
    if(_userTapped)
         //hideMenu
}

Теперь в вашем UIWebViewDelegate следуетStartLoadWithRequest (который вызывается, когдапользователь фактически нажал на ссылку)

if(_userTapped){
    _userTapped = NO;
     //possibly code to reshow or verify keep showing menu
}
1 голос
/ 24 августа 2013

Это сработало для me.try, добавив приведенную ниже строку кода

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
1 голос
/ 05 января 2012

Я искал то же самое и обнаружил следующее: есть специальное свойство iOS, которое отключает выноску, когда вы держите палец на ссылке.Вы добавляете это в стиль (CSS) ваших URL.

-webkit-touch-callout: none;
1 голос
/ 16 июня 2011

Вы можете использовать метод -webView:​shouldStartLoadWithRequest:​navigationType: * протокола UIWebViewDelegate.

Если navigationType равен UIWebViewNavigationTypeLinkClicked, вы можете получить URL для клика, установив [request URL].

0 голосов
/ 28 мая 2013

У меня была такая же проблема.Это решение сработало для меня:

1) убедитесь, что добавили протокол к вашему интерфейсу: UIGestureRecognizerDelegate например:

@interface ViewController : UIViewController _SlideViewProtocol, UIGestureRecognizerDelegate_

2) добавьте эту строку кода

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

3)

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(nextSlide)];
        swipeGesture.numberOfTouchesRequired = 1;
        swipeGesture.direction = (UISwipeGestureRecognizerDirectionLeft);
        swipeGesture.cancelsTouchesInView = YES;
        [swipeGesture setDelegate:self];
        [self.view addGestureRecognizer:swipeGesture];
...