2012-06-19 7 views
5

मैंने UIWebView को उपclass किया है ताकि मैं स्पर्श ईवेंट प्राप्त कर सकूं और इस आसान विधि को भी कार्यान्वित कर सकूं। मैं उत्सुक हूं, अगर यह वास्तविक आईओएस डिवाइस पर काम करेगा। मैं कार्यालय में नहीं हूं, इसलिए मुझे नहीं पता कि क्या करता है। ऐसा लगता है कि सिम्युलेटर में काम करता है।UIWebView उपclass पर tapAtPoint

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

क्या किसी ने ऐसा कुछ करने की कोशिश की है? मैं निश्चित रूप से सुबह में पता लगाने के लिए, lol।

+0

नहीं है कि '" _internal "' undocumented? क्या इसे ऐप्पल द्वारा अनुमोदित किया जाएगा? –

उत्तर

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

धन्यवाद, अगर आपको कोई समस्या आती है तो मुझे बताएं।

+0

क्या डबल क्लिक का उपयोग करना संभव है? मुझे लगता है कि एक फ़ंक्शन (tapinteractionwithloaction) है, जब मैं प्रदर्शन चयनकर्ता का उपयोग करता हूं, और CGPoint भेजता हूं, तो बिंदु का उपयोग नहीं किया जाता है। – OMGPOP

+0

touch.tapCount == 2 और तदनुसार प्रदर्शनकर्ता – sagarcool89

0

संक्षिप्त उत्तर: हाँ, मैंने इस तरह कुछ ऐसा करने की कोशिश की और यह वास्तविक उपकरणों पर भी काम करता है (आईओएस 6 के साथ परीक्षण किया गया)।

अपने विधि के एआरसी संस्करण:

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