4

タッチ イベントを取得できるように UIWebView をサブクラス化し、この便利なメソッドも実装しました。これが実際の iOS デバイスで動作するかどうか、興味があります。私はオフィスにいないので、あるかどうかはわかりません。シミュレーターで動作するようです。

- (void) tapAtPoint:(CGPoint)point
{
    id /*UIWebBrowserView*/ webBrowserView = nil;
    id webViewInternal = nil;
    object_getInstanceVariable(self, "_internal", (void **)&webViewInternal);
    object_getInstanceVariable(webViewInternal, "browserView", (void **)&webBrowserView);

    if (webBrowserView) {
        [webBrowserView tapInteractionWithLocation:point];
    }
}

誰かがこのようなことを試しましたか? きっと朝になればわかります(笑)。

4

2 に答える 2

0

このコードを試してください。ここでは正常に動作しています。

/* TapDetectingWindow.m */

#import "TapDetectingWindow.h"
@implementation TapDetectingWindow
@synthesize viewToObserve;
@synthesize controllerThatObserves;
- (id)initWithViewToObserver:(UIView *)view andDelegate:(id)delegate {
    if(self == [super init]) {
        self.viewToObserve = view;
        self.controllerThatObserves = delegate;
    }
    return self;
}
- (void)dealloc {
    [viewToObserve release];
    [super dealloc];
}
- (void)forwardTap:(id)touch {
    [controllerThatObserves userDidTapWebView:touch];
}
- (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];
    if (viewToObserve == nil || controllerThatObserves == nil)
        return;
    NSSet *touches = [event allTouches];
    if (touches.count != 1)
        return;
    UITouch *touch = touches.anyObject;
    if (touch.phase != UITouchPhaseEnded)
        return;
    if ([touch.view isDescendantOfView:viewToObserve] == NO)
        return;
    CGPoint tapPoint = [touch locationInView:viewToObserve];
    NSLog(@"TapPoint = %f, %f", tapPoint.x, tapPoint.y);
    NSArray *pointArray = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%f", tapPoint.x],
    [NSString stringWithFormat:@"%f", tapPoint.y], nil];
    if (touch.tapCount == 1) {
        [self performSelector:@selector(forwardTapwithObject:pointArray afterDelay:0.5];
    }
    else if (touch.tapCount > 1) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(forwardTap   object:pointArray];
    }
}
@end


/* WebViewController.h */

@interface WebViewController : UIViewController<TapDetectingWindowDelegate> {
    IBOutlet UIWebView *mHtmlViewer; 
    TapDetectingWindow *mWindow;
}

/* WebViewController.m */

- (void)viewDidLoad {
    [super viewDidLoad];
    mWindow = (TapDetectingWindow *)[[UIApplication sharedApplication].windows objectAtIndex:0];
    mWindow.viewToObserve = mHtmlViewer;
    mWindow.controllerThatObserves = self;
}

- (void)userDidTapWebView:(id)tapPoint
{
    NSLog(@"TapPoint = %f, %f", tapPoint.x, tapPoint.y);
}

ありがとう、問題が発生した場合はお知らせください。

于 2013-06-19T08:18:42.873 に答える
0

簡単な回答: はい、同じ方法でこのようなことを試してみましたが、実際のデバイスでも動作します (iOS 6 でテスト済み)。

メソッドの ARC バージョン:

- (void) tapAtPoint:(CGPoint)point
{
    Ivar internalWebViewIvar = class_getInstanceVariable([self class], "_internal");
    id internalWebView = object_getIvar(self, internalWebViewIvar);

    Ivar browserViewIvar = class_getInstanceVariable(object_getClass(internalWebView), "browserView");
    id browserView = object_getIvar(internalWebView, browserViewIvar);

    if (browserView) {
        [browserView performSelector:@selector(tapInteractionWithLocation:) withObject:[NSValue valueWithCGPoint:point]];
    }
}
于 2013-06-21T09:57:24.117 に答える