Как обнаружить касание UIWebView

В UIWebview, как я могу обнаружить прикосновение?

Но не тогда, когда пользователь нажимает на какой-либо URL-адрес или прикасается к элементу управления.

Можно ли его обрабатывать?

Ответ 1

Использовать метод UIGestureRecognizerDelegate:

Добавить UIGestureRecognizerDelegate в файл декларации (т.е. ваш .h файл)

Шаг 1: просто установите делегат gestureRecognizer: (в .m файле viewDidLoad)

UITapGestureRecognizer *webViewTapped = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
webViewTapped.numberOfTapsRequired = 1;
webViewTapped.delegate = self;
[offScreenWebView addGestureRecognizer:webViewTapped];
[webViewTapped release];

Шаг 2: переопределить эту функцию: (в .m файле)

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

Шаг 3: Теперь реализуем функцию tapAction:

- (void)tapAction:(UITapGestureRecognizer *)sender
{    
    NSLog(@"touched");

    // Get the specific point that was touched
    CGPoint point = [sender locationInView:self.view];
}

Ответ 2

Принятый ответ велик, если вам нужно только обнаружить ответвления. Если вам нужно обнаружить все касания, лучшим способом является создание нового подкласса UIView и размещение его над веб-просмотром. В подклассе вы можете обнаружить касания с помощью hitTest:

TouchOverlay.h

@class TouchOverlay;

@protocol TouchOverlayDelegate <NSObject>

@optional
- (void)touchOverlayTouched:(TV4TouchOverlay *)touchOverlay;

@end


@interface TouchOverlay : UIView
@property (nonatomic, unsafe_unretained) id <TouchOverlayDelegate> delegate;
@end

Touchoverlay.m

@implementation TouchOverlay

- (id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  return self;
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  UIView *hitView = [super hitTest:point withEvent:event];
  if (hitView == self) {
    if (self.delegate && [self.delegate respondsToSelector:@selector(touchOverlayTouched:)]) {
      [self.delegate touchOverlayTouched:self];
    }
    return nil;     // Tell the OS to keep looking for a responder
  }
  return hitView;
}

@end

Ответ 3

Все, что наследуется от UIResponder, может обрабатывать штрихи (также UIWebView). Прочтите документ: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIResponder_Class/Reference/Reference.html

Вам нужно будет использовать:

touchesBegan:withEvent:

Изменить: Добавление комментария для ясности -

Я считаю, что нет чистого способа сделать это, вы можете либо переопределить метод hittest с помощью метода Event, например this, либо сделать взломать вот так: переопределение UIView

Ответ 4

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

В моих целях мне нужно было быть в курсе обо всех, и поэтому я добавил распознавателей жестов. (Обратите внимание, что, несмотря на бит поле, вы не можете OR совместно использовать атрибуты распознавания жестов direction, поэтому для обнаружения любых ударов требуется 4 распознавателя жестов).

// Note that despite being a bit field, you can't `OR` together swipe gesture
// recognizers' `direction` property, so 4 gesture recognizers are required
// to detect any swipe
for (NSNumber * swipeDirection in @[@(UISwipeGestureRecognizerDirectionUp), @(UISwipeGestureRecognizerDirectionDown), @(UISwipeGestureRecognizerDirectionLeft), @(UISwipeGestureRecognizerDirectionRight)]) {

    UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(timerReset:)];
    swipe.direction = [swipeDirection integerValue];
    swipe.delegate = self;
    [rootWebView addGestureRecognizer:swipe];
}

Ответ 5

Вы хотите, чтобы вы переопределили параметры, которые появляются, когда они удерживают ссылку? Мне удалось заставить его работать с этим учебным пособием/гидом, но тот, который выложил здесь, все еще немного глючит, и вам нужно сделать небольшую настройку: http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/