Распознавание жеста с помощью 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];