Как обнаружить прикосновение в UIWebView - PullRequest
13 голосов
/ 19 января 2011

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

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

Возможно ли справиться с этим?

Ответы [ 5 ]

34 голосов
/ 09 августа 2012

Используйте метод UIGestureRecognizerDelegate:

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

Шаг 1: Просто установите делегат gestRecognizer: (в файле .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 голосов
/ 08 апреля 2015

Принятый ответ хорош, если вам нужно только обнаружить постукивания. Если вам нужно обнаружить все прикосновения, лучше всего создать новый подкласс 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
1 голос
/ 17 марта 2015

Обратите внимание, что принятый ответ, приведенный выше, будет фиксировать только жесты касание (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];
}
0 голосов
/ 19 января 2011

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

0 голосов
/ 19 января 2011

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

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

touchesBegan:withEvent:

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

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

...