2012-06-19 21 views
5

UIWebView alt sınıflarım var, böylece dokunma olayları elde edebilir ve bu kullanışlı yöntemi uygulayabilirim. Bu, gerçek bir iOS cihazında çalışacaksa merak ediyorum. Ben ofiste değilim, o zaman bilmiyorum. Simülatörde çalışıyor gibi görünüyor.tapAtPoint on UIWebView alt sınıfı

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

Böyle bir şey deneyen var mı? Sabahları mutlaka öğreniyorum, lol.

+0

' "_internal"' belgesiz değil mi? Apple tarafından onaylanacak mı? –

cevap

0

Lütfen bu kodu deneyin, İşte iyi çalışıyor.

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

Teşekkürler, Herhangi bir sorunla karşılaşırsanız bildirin.

+0

çift tıklama kullanmak mümkün mü? Performselector kullandığımda ve CGPoint'i gönderdiğimde bir noktanın (tapinteractionwithloaction) olduğunu düşünüyorum, nokta kullanılmıyor. – OMGPOP

+0

touch.tapCount == 2 ve selectselector buna göre – sagarcool89

0

kısa yanıt: Evet, ben de aynı şekilde böyle bir şey denedim ve gerçek aygıtlarda da çalışıyor (iOS 6 ile test edilmiş). senin yöntemin

ARC sürümü:

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