2012-10-18 15 views
5

में पॉप अप बटन कैसे जोड़ें, जब मैं UIWebView से किसी भी यूआरएल में संगीत प्ले विकल्प को दबाता हूं तो बहरा पॉप अप खोला जाता है। मैं पॉप अप में एक और बटन जोड़ना चाहता हूं .. क्या यह संभव है ..UIWebView

जैसा कि मैं FETCH बटन जोड़ना चाहता हूं।

और क्या मैं डिफ़ॉल्ट पॉप अप फ़ंक्शनिंग में परिवर्तन कर सकता हूं जो OPEN और COPY है।

सबसे पहले, तुम सच में नहीं अतिरिक्त मेनू आइटम मानक प्रासंगिक मेनू के डिफ़ॉल्ट लोगों को जोड़ सकते हैं - नीचे

enter image description here

मुझे पता है कि गूगल द्वारा आ दिखाया गया है। लेकिन आप एक निश्चित सीएसएस संपत्ति का उपयोग कर प्रासंगिक मेनू को बंद कर सकते हैं। तो समाधान डिफ़ॉल्ट मेनू को बंद करना और स्क्रैच से अपना स्वयं का कार्यान्वयन करना होगा। और अपने स्वयं के प्रासंगिक मेनू को लागू करने के लिए, आपको पहले टैब-एंड-होल्ड इशारा पकड़ना होगा, स्क्रीन पर उंगली के निर्देशांक प्राप्त करें, इन निर्देशांकों को वेब पेज की समन्वय प्रणाली में अनुवाद करें और आखिर में HTML तत्वों को देखें यह स्थान

+0

किसी को भी मदद है .............. –

+0

मेरा उत्तर आप के लिए इस का समाधान हुआ? –

उत्तर

5

नया उत्तर:

इस तरह लग रहा है कि हम क्या चाहते हैं, यहाँ है:

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: कहा जाता था। लेकिन मुझे फंकी व्यवहार मिल रहा था, इसलिए एक झुकाव पर मैंने वेबव्यू निर्देशांक का उपयोग किया और यह ठीक काम किया, यहां तक ​​कि जब मैं नीचे और नीचे स्क्रॉल किया गया था तो एक बड़े वेबपृष्ठ पर भी। मुझे संदेह है कि वेबव्यू के अंदर कुछ प्रकार के ऐप्पल प्रोग्राम किए गए व्यवहार उन निर्देशांकों का अनुवाद कर सकते हैं। शायद जेएस की समन्वय प्रणाली को स्क्रॉलव्यू के अंदर सामग्री दृश्य को स्थानांतरित करने के तरीके के आधार पर बदला जाता है - जो मुझे सबसे ज्यादा समझ में आता है।

+0

या मैट ... ths उत्तर ने मुझे बहुत मदद की..और एक चीज जो अनुत्तरित है जिसे javascipt में ले जाना चाहिए .. नीचे दिए गए उत्तर ने मुझे सही ढंग से –

0

आप कुछ इस तरह के साथ ईवेंट को सक्रिय कर सकते हैं:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if(navigationType == UIWebViewNavigationTypeLinkClicked) 
    { 
    // Handle your URL click here (open the popup menu) 
    // ... 
    return NO; 
    } 
    return YES; 
} 

मत भूलना UIWebView को सौंपने के लिए

+0

यह प्रश्न नहीं है कि प्रश्न पोस्टर वास्तव में क्या देख रहा था। –

2

इस सवाल का जवाब देना उचित और सही रास्ता लिंक नीचे

http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

+0

वाह खोजने में मदद की। बहुत अच्छा। –

+0

या धन्यवाद, लेकिन काम नहीं कर रहा है .. मुझे वाई नहीं पता ... लेकिन मैंने सभी बदलाव किए हैं .. डिफ़ॉल्ट पॉप अप अवरुद्ध हो जाता है लेकिन कोड के अनुसार पॉप अप करें जो विशेष पॉप अप नहीं दिखा रहा है –

+0

मैंने एक टेस्ट प्रोजेक्ट बनाया और इसे काम करने के लिए मिला। ... यह इस लिंक में क्या है उससे बहुत कम कोड का उपयोग करता है। मेरा जवाब देखें –