2012-06-19 30 views
5

Tôi có UIWebView được phân lớp để tôi có thể nhận các sự kiện chạm và cũng triển khai phương pháp tiện dụng này. Tôi tò mò, nếu điều này sẽ làm việc trên một thiết bị iOS thực tế. Tôi không ở văn phòng, vì vậy tôi không biết nếu có. Dường như nó hoạt động trong trình mô phỏng.tapAtPoint trên lớp con UIWebView

- (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]; 
    } 
} 

Có ai đã thử một cái gì đó như thế này không? Tôi chắc chắn tìm ra vào buổi sáng, lol.

+0

Mà không phải là ' "_internal"' cung cấp tài liệu? Nó sẽ được Apple chấp thuận? –

Trả lời

0

Vui lòng thử mã này, Tại đây hoạt động tốt.

/* 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); 
} 

Xin cảm ơn, Hãy cho tôi biết nếu bạn gặp phải bất kỳ sự cố nào.

+0

có thể sử dụng nhấp đúp không? Tôi nghĩ rằng có một chức năng (tapinteractionwithloaction), khi tôi sử dụng performselector, và gửi CGPoint, điểm không được sử dụng. – OMGPOP

+0

touch.tapCount == 2 và performselector phù hợp – sagarcool89

0

câu trả lời ngắn gọn: Có, tôi đã thử một cái gì đó như thế này theo cách tương tự và nó cũng hoạt động trên các thiết bị thực (được thử nghiệm với iOS 6).

ARC phiên bản của phương pháp của bạn:

- (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]]; 
    } 
} 
Các vấn đề liên quan