Распознавание жеста с помощью UIWebView

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

Можно ли обнаружить кран, который не касался ссылки? Могу ли я сделать это, увидев, где произошло крана, и принимать меры, только если это не произошло в 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 также заставляет панель уходить. Я хочу, чтобы панель инструментов исчезла, если ссылка не была нажата.

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

Спасибо.

Крис

Спасибо Крис

Ответ 1

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

Ответ 2

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

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

то в методе gateure метода delegateRecognizer: 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 shouldStartLoadWithRequest (который вызывается, когда пользователь фактически нажал ссылку)

if(_userTapped){
    _userTapped = NO;
     //possibly code to reshow or verify keep showing menu
}

Ответ 3

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

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

Ответ 4

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

-webkit-touch-callout: none;

Ответ 5

Это сработало для меня. добавив следующую строку кода

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

Ответ 6

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

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];