webview 响应

UIWebView完美解决响应touch问题

http://www.developers-life.com/touchbegantouchend-in-custom-uiwebview.html

网上找了好久好久都没有解决,终于被我找到解决方法了。

一开始重写UIWebView的touch方法,发现确实可以tap了,可是web view里的URL点击却无效了,原来touch即使传给了next responder,也无法再回到UIWebViewDelegate里调用几个delegate函数。

下面的这个方法,既可以点击URL,又可以响应tap,也是通过写一个新的UIWebView的子类来实现的:

 

PSWebView.h

#import <UIKit/UIKit.h>

@interface PSWebView : UIWebView
@end

PSWebView.m

#import <objc/runtime.h>
#import "PSWebView.h"

@interface NSObject (UIWebViewTappingDelegate)
- (void)webView:(UIWebView*)sender zoomingEndedWithTouches:(NSSet*)touches event:(UIEvent*)event;
- (void)webView:(UIWebView*)sender tappedWithTouch:(UITouch*)touch event:(UIEvent*)event;
@end

@interface PSWebView (Private)
- (void)fireZoomingEndedWithTouches:(NSSet*)touches event:(UIEvent*)event;
- (void)fireTappedWithTouch:(UITouch*)touch event:(UIEvent*)event;
@end

@implementation UIView (__TapHook)

- (void)__touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
     [self __touchesEnded:touches withEvent:event];
     
     id webView = [[self superview] superview];
     if (touches.count > 1) {
          if ([webView respondsToSelector:@selector(fireZoomingEndedWithTouches:event:)]) {
               [webView fireZoomingEndedWithTouches:touches event:event];
          }
     }
     else {
          if ([webView respondsToSelector:@selector(fireTappedWithTouch:event:)]) {
               [webView fireTappedWithTouch:[touches anyObject] event:event];
          }
     }
}

@end

static BOOL hookInstalled = NO;

static void installHook()
{
     if (hookInstalled) return;
     
     hookInstalled = YES;
     
     Class klass = objc_getClass("UIWebDocumentView");
     Method targetMethod = class_getInstanceMethod(klass, @selector(touchesEnded:withEvent:));
     Method newMethod = class_getInstanceMethod(klass, @selector(__touchesEnded:withEvent:));
     method_exchangeImplementations(targetMethod, newMethod);
     
}

@implementation PSWebView

- (id)initWithCoder:(NSCoder*)coder
{
    if (self = [super initWithCoder:coder]) {
          installHook();
    }
    return self;
}

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

- (void)fireZoomingEndedWithTouches:(NSSet*)touches event:(UIEvent*)event
{
     if ([self.delegate respondsToSelector:@selector(webView:zoomingEndedWithTouches:event:)]) {
          [(NSObject*)self.delegate webView:self zoomingEndedWithTouches:touches event:event];
     }
}

- (void)fireTappedWithTouch:(UITouch*)touch event:(UIEvent*)event
{
     if ([self.delegate respondsToSelector:@selector(webView:tappedWithTouch:event:)]) {
          [(NSObject*)self.delegate webView:self tappedWithTouch:touch event:event];
     }
}

@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值