नया उत्तर:
इस तरह लग रहा है कि हम क्या चाहते हैं, यहाँ है:
https://stackoverflow.com/a/3198220/700471
पुराने उत्तर :
क्या आप अपने प्रश्न में वर्णन सटीक लगता है::
सबसे पहले, तुम सच में नहीं अतिरिक्त मेनू आइटम को जोड़ सकते हैं
ठीक है, कुछ शोध के बाद, यहाँ सौदा है मानक प्रासंगिक मेनू के डिफ़ॉल्ट वाले। लेकिन आप एक निश्चित सीएसएस संपत्ति का उपयोग कर प्रासंगिक मेनू को बंद कर सकते हैं। तो समाधान डिफ़ॉल्ट मेनू को बंद करना होगा और स्क्रैच से अपना स्वयं का कार्यान्वयन करना होगा। और अपने स्वयं के प्रासंगिक मेनू को लागू करने के लिए, आपको पहले टैब-एंड-होल्ड इशारा पकड़ना होगा, स्क्रीन पर उंगली के निर्देशांक प्राप्त करें, इन निर्देशांकों को वेब पेज की समन्वय प्रणाली में अनुवाद करें और अंत में देखें इस स्थान पर एचटीएमएल तत्व।
तो आप प्रासंगिक मेनू के साथ अपने स्वयं के पॉपओवर नियंत्रक को लागू करने की योजना बना रहे हैं - ठीक है, मैं इसमें बिल्कुल नहीं जाऊंगा, मैं आपको यह जानूंगा कि यह कैसे करना है।
आपका प्रश्न क्या प्रतीत होता है, आप UIWebView में एक लंबे टैप इशारा कैसे लेते हैं और इसे चयनित डीओएम तत्व खोजने के लिए वेबपृष्ठ के निर्देशांक में बदलते हैं, और उस संदर्भ के रूप में इसका उपयोग करते हैं अपने पॉपओवर मेनू उत्पन्न करने के लिए।
मैं क्या पाया कोड की इस पंक्ति के साथ this था, विशेष रूप से this:
NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).innerHTML", touchPoint.x, touchPoint.y];
कि जे एस की तरह दिखता है आप यह पता लगाने की क्या तत्व सिर्फ लंबे समय से दबाया गया था की जरूरत है, और निश्चित रूप से आपको यह देखने के लिए कुछ आंकड़ा-आंकड़ा करने की आवश्यकता होगी कि यह एक लिंक था और वहां से अपना संदर्भ मेनू निष्पादित करता है, लेकिन ऐसा कुछ नहीं है जिसे मैंने देखा है।
कुछ आगे विचार:
शायद सबसे आसान पाठ्यक्रम अपने UIWebView करने के लिए एक UILongPressGestureRecognizer
देते हैं (यह एक निब में आसानी से किया जा सकता है) और यह सुनिश्चित करें कि पर एक उपयुक्त IBAction के लिए "एक्शन भेजा गया" अंक बनाने के लिए किया जाएगा आपका व्यू कंट्रोलर। (मैं आप के रूप में अच्छी प्रतिनिधि आउटलेट इस्तेमाल कर सकते हैं लगता है, लेकिन मैं ऐसा करने की जरूरत कभी नहीं किया है।)
किसी भी मामले में, आप अपने इशारे पहचानकर्ता के locationOfTouch:inView: विधि का उपयोग कर सकते हैं, और देखने आप शायद का उपयोग करना चाहते जाएगा UIWebView का सामग्री दृश्य होगा, जो मुझे विश्वास है कि आप myWebView.scrollView.subviews[0]
(या ऑब्जेक्ट एट इंडेक्स: भिन्नता के साथ कुछ प्राप्त कर सकते हैं यदि आप नई सरणी अनुक्रमणिका सबस्क्रिप्ट का उपयोग नहीं कर रहे हैं)।
वैसे भी, मुझे लगता है कि मैंने आपके प्रश्न का उत्तर देने के लिए पर्याप्त प्रदान किया है।
संपादित करें:
ठीक है, तो आप अभी भी इस समस्या हो रही है, तो मैं चला गया और एक परीक्षण परियोजना बना दिया है और यह काम करने के लिए मिला है। एक चीज जो इस बारे में थोड़ा परेशान है कि वेबकिट किसी भी तरह से डोम में ऑब्जेक्ट्स के आस-पास "बफर" क्षेत्र जोड़ता है, जिसका अर्थ है कि यदि आप के बगल में एक लिंक जोड़ते हैं तो यह अभी भी हाइलाइट होगा, लेकिन जब आप जेएस कमांड elementFromPoint
का उपयोग करेंगे ऐसा नहीं करता है, इसलिए आपको इस विधि का उपयोग करके पॉपअप को ट्रिगर करने के लिए अधिक ध्यान से स्पर्श करना होगा। लेकिन, यह काम करता है।
मैंने "एकल दृश्य" टेम्पलेट के साथ एक खाली परियोजना बनाई, और UIWebView
को xib में फेंक दिया, फ़ाइल के मालिक को delegate
आउटलेट इंगित किया। फिर मैंने UIWebView से जुड़ा हुआ xib में UILongPressGestureRecognizer
लगाया। मैंने फ़ाइल के मालिक के रूप में delegate
सेट किया है, और selector
आउटलेट को longPressDetected
फ़ाइल के स्वामी में IBAction पर सेट किया है। मैंने इंटरफ़ेस बिल्डर में पहचानकर्ता के गुणों में "दृश्य में रद्द" को भी अनचेक किया।
यहां व्यू कंट्रोलर के लिए कोड है।
इंटरफ़ेस:
//
// WVTViewController.h
// WebViewTest
//
#import <UIKit/UIKit.h>
@interface WVTViewController : UIViewController <UIWebViewDelegate, UIGestureRecognizerDelegate>
@property (nonatomic, weak) IBOutlet UIWebView *myWebView;
@property (nonatomic) BOOL didFirstLoad;
- (IBAction)longPressDetected:(id)sender;
@end
कार्यान्वयन:
//
// WVTViewController.m
// WebViewTest
//
#import "WVTViewController.h"
@interface WVTViewController()
@end
@implementation WVTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Just load google.
NSURL *theURL = [NSURL URLWithString:@"http://www.google.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:theURL];
[self.myWebView loadRequest:request];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
if (!self.didFirstLoad) {
// Disable the default contextual menu.
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"];
}
}
// Called by the gesture recognizer.
- (IBAction)longPressDetected:(UILongPressGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
CGPoint webViewCoordinates = [sender locationInView:self.myWebView];
NSLog(@"WebView coordinates are: %@", NSStringFromCGPoint(webViewCoordinates));
// Find the DOM element
NSString *locatorString = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).innerHTML", webViewCoordinates.x, webViewCoordinates.y];
NSString *result = [self.myWebView stringByEvaluatingJavaScriptFromString: locatorString];
NSLog(@"Element Found: %@", result);
}
}
// Necessary or the gesture recognizer won't call the IBAction.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
@end
जैसा कि मैंने कहा, मैं ऊपर कोड का परीक्षण किया और यह ठीक काम करता है। आप निश्चित रूप से अपने जेएस को बदल सकते हैं और innerHTML
, tagName
या href
या जो कुछ भी आपको पसंद है, के अलावा कुछ और उपयोग कर सकते हैं। जो भी आप करने की कोशिश कर रहे हैं, उसके लिए एकाधिक चेक आवश्यक हो सकते हैं, संभवतः कतारबद्ध जेएस कमांड (जो लंगड़ा होगा) के साथ, जब तक कि आप JSON-DOM ऑब्जेक्ट को स्ट्रिंग नहीं कर सकते, इसे वापस ऑब्जेक्टिव-सी पर पास कर दें, मूल वस्तुओं में कनवर्ट करें और उस माहौल में अपने चेक करें - लेकिन, मैं कोई जेएस प्रो नहीं हूं और मैं इसकी जांच नहीं कर रहा हूं।
एक नोट के रूप में, मुझे आश्चर्य हुआ कि elementFromPoint
के लिए काम करने वाले निर्देशांक UIWebView के भीतर स्पर्श निर्देशांक थे। मैंने myWebView.scrollView.subviews
के माध्यम से कोड के पूरे ब्लॉक को घुमाया था और सामग्री दृश्य मिला, जिसे उस दृश्य पर locationOfTouch:inView:
कहा जाता था। लेकिन मुझे फंकी व्यवहार मिल रहा था, इसलिए एक झुकाव पर मैंने वेबव्यू निर्देशांक का उपयोग किया और यह ठीक काम किया, यहां तक कि जब मैं नीचे और नीचे स्क्रॉल किया गया था तो एक बड़े वेबपृष्ठ पर भी। मुझे संदेह है कि वेबव्यू के अंदर कुछ प्रकार के ऐप्पल प्रोग्राम किए गए व्यवहार उन निर्देशांकों का अनुवाद कर सकते हैं। शायद जेएस की समन्वय प्रणाली को स्क्रॉलव्यू के अंदर सामग्री दृश्य को स्थानांतरित करने के तरीके के आधार पर बदला जाता है - जो मुझे सबसे ज्यादा समझ में आता है।
किसी को भी मदद है .............. –
मेरा उत्तर आप के लिए इस का समाधान हुआ? –