2012-10-25 12 views
15

मैं एक मोडल में UIWebView लोड कर रहा हूं। वेब पेज में कुछ इनपुट हैं जो आईओएस 5 में बिल्कुल सही काम करते हैं। हालांकि आईओएस 6 में, जब भी कोई इनपुट फोकस हो जाता है, तो कुंजीपटल फॉर्म के स्वचालित 'केंद्रित' कर रहा है, भले ही इनपुट में ऊपर दिखाया जाने वाला बहुत सारे कमरे हों कुंजीपटल। चूंकि कुछ इनपुट पृष्ठ के शीर्ष पर हैं, इसलिए इससे उन्हें बाहर देखने में मजबूर किया जाता है ताकि उपयोगकर्ता यह नहीं देख सके कि वे क्या टाइप कर रहे हैं। इनपुट देखने के लिए बैक अप को स्क्रॉल करने से कुंजीपटल खारिज होने तक इनपुट को रोकना बंद कर देता है (बदले में इसे फिर से देखने के लिए स्क्रॉल करना)। क्या यह आईओएस 6 में एक अपेक्षित व्यवहार है? जब कोई इनपुट फोकस प्राप्त करता है (जैसे आईओएस 5 कैसे काम करता है) को वेबव्यू स्क्रॉल करने से रखने का कोई तरीका है?UIWebView इनपुट फोकस पर स्क्रॉलिंग आईओएस 6 केवल

+0

आपके UIWebView का फ्रेम क्या है? – Jessedc

+0

क्या आप मुझे वेब व्यू में जो खोल रहे हैं उसे लिंक/यूआरएल दे सकते हैं। ताकि मैं आपकी समस्या को बेहतर समझ सकूं। – Swati

उत्तर

11

अपने कोड की आंतरिक कार्यप्रणाली को जानने के बिना, मैं जितना संभव हो उतना मदद करने की कोशिश करने जा रहा हूं। यदि कुछ और नहीं है, तो मुझे आशा के लिए कुछ भोजन प्रदान करने की उम्मीद है। आप दो सवाल पूछा:

यह iOS6 में अपेक्षित व्यवहार है?

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

क्या इनपुट को फोकस करने पर वेबव्यू को स्क्रॉल करने से कोई तरीका है (जैसे आईओएस 5 कैसे काम करता है)?

हां। मैं स्क्रॉलिंग से वेब व्यू को रोकने के लिए बस नीचे यह करने के लिए कोड प्रदान करता हूं। यदि वह वही है जो आप करना चाहते हैं, तो बढ़िया। हालांकि, स्क्रॉलिंग से वेब व्यू को रोकना आईओएस 5 के समान व्यवहार प्राप्त करने जैसा नहीं है। फिर भी, मैं आपको यह विकल्प देना चाहता था जैसा आपने अनुरोध किया था।

#import "ViewController.h" 

@interface ViewController() <UIScrollViewDelegate> { 
    CGPoint origin; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
    [self.webView loadRequest:request]; 
    self.webView.scrollView.delegate = self; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

    // NOTE THAT SIMPLY DISABLING THE SCROLL WILL NOT PREVENT KEYBOARD SCROLL 
    //[self.webView.scrollView setScrollEnabled:NO]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)keyboardWillShow { 
    NSLog(@"keyboard"); 
    origin = self.webView.scrollView.contentOffset; 

} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 
    [self.webView.scrollView setContentOffset:origin]; 
} 

@end 

आप लगातार स्क्रॉल व्यवहार चाहते हैं ...

मैं इस पुस्तक संशोधन अप कोड करने के लिए कुछ समय ले लिया। आप इसे अपने स्वयं के स्क्रॉल व्यवहार में संदर्भ के रूप में उपयोग कर सकते हैं जो आईओएस 5 & 6 पर संगत है। इस कोड में: जब उपयोगकर्ता किसी वेबपृष्ठ पर टेक्स्ट इनपुट बॉक्स पर क्लिक करता है, तो कोड डिफ़ॉल्ट स्क्रॉलिंग व्यवहार को रोककर रोक देगा पेज अपनी वर्तमान स्थिति में स्क्रॉल किया गया। दुर्भाग्यवश, सभी स्क्रॉलिंग को रद्द करने का कोई तरीका नहीं है, बल्कि आपको स्क्रॉल को ओवरराइड करना होगा।एक बार जब डिफ़ॉल्ट स्क्रॉलिंग "दबा दी गई" हो जाती है, तो उसे सक्रिय इनपुट बॉक्स की स्थिति मिल जाती है और उस स्थिति में स्क्रॉल हो जाता है। यह स्क्रीन के शीर्ष पर सक्रिय इनपुट बॉक्स डाल देगा। आप इसे अपनी वरीयताओं के अनुसार संशोधित कर सकते हैं। उदाहरण के लिए, आप इसे आईओएस 5 की तरह बनाने के लिए [UIScrollView scrollRectToVisible] का उपयोग कर सकते हैं।

#import "ViewController.h" 

@interface ViewController() <UIScrollViewDelegate> { 
    CGPoint origin; 
    CGPoint activeElementOrigin; 
    BOOL pauseScroll; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
    [self.webView loadRequest:request]; 
    self.webView.scrollView.delegate = self; 

    pauseScroll = NO; 
    origin = CGPointZero; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 
} 

- (void)keyboardWillShow { 
    NSLog(@"keyboard"); 
    pauseScroll = YES; 
    origin = self.webView.scrollView.contentOffset; 
} 

- (void)keyboardDidShow { 
    NSLog(@"keyboard DID SHOW"); 
    pauseScroll = NO; 
    [self.webView.scrollView setContentOffset:activeElementOrigin animated:YES]; 
} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSLog(@"scroll"); 

    if (pauseScroll) { 
     [self.webView.scrollView setContentOffset:origin animated:NO]; 

     NSString *javaScript = [NSString stringWithFormat:@"function f(){ var textField = document.activeElement; return textField.getBoundingClientRect().top; } f();"]; 
     NSString *textFieldRectTop = [self.webView stringByEvaluatingJavaScriptFromString:javaScript]; 
     activeElementOrigin = origin; 
     activeElementOrigin.y = [textFieldRectTop floatValue]-10; 
    } 
} 


@end 

यदि यह कोड आपको मदद की, यह मेरे लिए इनाम पुरस्कृत करने के लिए आप में से बहुत अच्छा होगा। मैं विनम्रतापूर्वक सराहना करता हूं।

+0

धन्यवाद, बहुत अच्छी तरह से। मैं आपके उदाहरणों के आधार पर काम करने में सक्षम था। – Yeti42

+0

आईओएस 7 पर काम नहीं करता है। – Dmitry

+0

मैंने सचमुच अपने ऐप में इस समस्या को हल करने के लिए घंटे बिताए हैं, और आपके समाधान ने अंततः इसे हल किया है। बहुत बहुत धन्यवाद! –

0

का संभावित हल इस UIWebView में स्क्रॉल अक्षम करने जा सकता है:

UIScrollView *scrollView = webView.scrollView; 
[scrollview setScrollEnabled:NO]; 
[scrollView bounces:NO]; 

एक और इस scrollview की UIEdgeInsets की स्थापना की जा सकती है, लेकिन मैं इस बारे में ज्यादा पता नहीं है।

मुझे लगता है कि यह सिर्फ ते कुंजीपटल (जैसे सफारी करता है) के शीर्ष पर इनपुट क्षेत्र बनाने के लिए स्क्रॉल करने के लिए दोनों आईओएस 5 और 6 में एक मानक व्यवहार है।

+0

scrollEnabled केवल उपयोगकर्ता स्क्रॉलिंग को रोकता है, कीबोर्ड सिस्टम स्क्रॉलिंग नहीं –

+0

आपकी प्रतिक्रिया के लिए धन्यवाद जानना अच्छा है – dulgan

0

इस पोस्ट पर जाँच की जवाब अपने जवाब है: How to make a UITextField move up when keyboard is present?

संक्षेप में, आप आदानों जो दृश्य से बाहर धक्का दे दिया जा रहा है जिसमें दृश्य बढ़ने की जरूरत है। पोस्ट में नमूना कोड भी शामिल है कि इसे कैसे करें।

उम्मीद है कि इससे मदद मिलती है।

+0

प्रश्न विशेष रूप से वेब व्यू के संबंध में है। एक वेबपृष्ठ के भीतर UITextField और एक फॉर्म इनपुट फ़ील्ड के बीच एक बड़ा अंतर है। आपके द्वारा संदर्भित पोस्ट वेब व्यू पर काम नहीं करेगा। –

संबंधित मुद्दे