2011-06-04 8 views
13

iPhone के संदर्भ में की बढ़त अतीत इसकी चौड़ाई बढ़ जाती है UIScrollView स्वचालित रूप से स्क्रॉल। जब उपयोगकर्ता UIImage के अंदर स्क्रीन को टैप करता है, तो उपयोगकर्ता को स्पर्श करने पर UITextField जोड़ा जाता है। उपयोगकर्ता इस UITextField को संपादित कर सकता है, और पाठ फ़ील्ड स्वचालित रूप से आकार बदल जाएगा या नहीं, पाठ को जोड़ा या हटा दिया गया था या नहीं।UIKit:</p> <p>मैं एक UIScrollView एक UIImage युक्त होती है: जब एक subview स्क्रीन

जब एक UITextField संपादित किया जा रहा है इसकी चौड़ाई बढ़ जाती है, तो स्क्रॉलव्यू स्वचालित रूप से बढ़ी हुई चौड़ाई दिखाने के लिए स्क्रॉल करता है।

समस्या क्योंकि पाठ फ़ील्ड का स्वत: स्क्रॉल स्क्रीन

उदाहरण के लिए की y- मान सम्मान नहीं करता है में आता है, कहते हैं कि उपयोगकर्ता छवि के नीचे करने के लिए एक पाठ क्षेत्र गयी। जब वे उस टेक्स्ट फ़ील्ड को संपादित करने के लिए जाते हैं, तो कीबोर्ड फ़ील्ड को छुपाएगा, कीबोर्ड दिखाएगा। मेरे पास टेक्स्ट फ़ील्ड दिखाने के लिए स्क्रीन स्क्रॉल करने के लिए कोड है। समस्या तब आती है जब उपयोगकर्ता इतना टेक्स्ट दर्ज करता है कि वह टेक्स्ट फ़ील्ड स्क्रीन के किनारे से आगे बढ़ता है। जब ऐसा होता है, तो स्क्रीन व्यापक पाठ को फिट करने के लिए क्षैतिज रूप से स्क्रॉल करती है, लेकिन लंबवत भी - वर्टिकल स्क्रॉलिंग टेक्स्टफील्ड को छिपाने के लिए समाप्त होती है, मूल रूप से टेक्स्ट फ़ील्ड दिखाने के लिए मैंने जो कुछ भी किया है उसे रद्द कर दिया।

कोड पाठ क्षेत्र दिखाने के लिए अगर यह कीबोर्ड से छिपा हुआ है:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    CGSize stringSize = [string sizeWithFont:textField.font]; 
    CGSize newSize = [newString sizeWithFont:textField.font]; 

    // Make textField wider if we're close to running up against it 
    if (newSize.width > (textField.frame.size.width - self.widthOffset)) { 
     CGRect textFieldFrame = textField.frame; 
     if (stringSize.width > self.widthOffset) { 
      textFieldFrame.size.width += stringSize.width; 
     } 
     textFieldFrame.size.width += self.widthOffset; 
     textField.frame = textFieldFrame; 
    } 

    // Shrink the textField if there is too much wasted space 
    if ((textField.frame.size.width - newSize.width) > self.widthOffset) { 
     CGRect textFieldFrame = textField.frame; 
     textFieldFrame.size.width = newSize.width + self.widthOffset; 
     textField.frame = textFieldFrame; 
    } 
    return YES; 
} 

सवाल यह है::

- (void)keyboardWasShown:(NSNotification*)notification 
{ 
    NSDictionary* info = [notification userInfo]; 
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    self.offset = self.contentOffset; 

    CGRect frame = self.frame; 
    // self.activeField is the name of the field that is the current first responder - this just adds a little bit of padding 
    frame.size.height -= keyboardSize.height + (self.activeField.frame.size.height * 2); 

    if (!CGRectContainsPoint(frame, self.activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(self.offset.x, self.activeField.frame.origin.y - keyboardSize.height + (activeField.frame.size.height * 2)); 
    [self setContentOffset:scrollPoint animated:YES]; 
    } 
} 

यहाँ पाठ क्षेत्र के आकार को बढ़ाने के लिए कोड है कैसे क्या स्वचालित रूप से स्क्रॉल करते समय मुझे वाई-वैल्यू का सम्मान करने के लिए UIScrollView मिलता है?

+2

बहुत बढ़िया सवाल! – Legolas

+0

यदि आप नमूना प्रोजेक्ट के साथ एक लिंक प्रदान कर सकते हैं तो इससे मदद मिलेगी। –

उत्तर

0

सामग्री ऑफ़सेट बदलने के बजाय, स्क्रॉल व्यू के प्रदर्शन फ्रेम को बदलें।

- (void)keyboardWill:(NSNotification*)notification 
{ 
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    // Update the scroll view's frame to the region not covered by the keyboard. 
    self.frame = CGRectMake(self.fullSizedFrame.origin.x, 
          self.fullSizedFrame.origin.y, 
          self.fullSizedFrame.size.width, 
          self.fullSizedFrame.size.height - keyboardSize.height); 
} 

- (void)keyboardWillHide:(NSNotification*)notification 
{ 
    // Set the frame back to the original frame before the keyboard was shown. 
    self.frame = self.fullSizedFrame; 
} 

आप उपयोगकर्ता स्क्रीन ओरिएंटेशन बदलने की अनुमति नहीं देते हैं, तो fullSizedFrame देखने के मूल फ्रेम करने के लिए सेट किया जा सकता है जब वह पहली बार प्रदर्शित किया जाता है। यदि अभिविन्यास में परिवर्तन की अनुमति है, तो आपको अभिविन्यास के आधार पर पूर्ण आकार के फ्रेम के लिए उचित मान की गणना करने की आवश्यकता होगी।

+0

यह काम नहीं किया। मैं कीबोर्ड की ऊंचाई से UIScrollView के फ्रेम की ऊंचाई को पहले ही ऑफसेट कर रहा हूं। –

5

मूल रूप से UIScrollView के सेटफ्रेम को _adjustContentOffsetIfNecessary द्वारा किए गए स्क्रॉलव्यू ऑफ़सेट को समायोजित कर देगा। चूंकि यह विधि निजी है और दस्तावेज नहीं है, इसलिए हम बहुत कम महसूस कर सकते हैं कि समायोजन कैसे होगा। अनावश्यक स्क्रॉलिंग या गलत ऑफसेट सेट करने के दो तरीके हैं:

1) सेटफ्रेम लागू करने के बाद UIScrollView ऑफसेट को रीसेट करें। यह आप कर सकते हैं, अगर आप कुछ गणनाओं के आधार पर जानबूझकर UIScrollView के फ्रेम को संशोधित कर रहे हैं।

CGPoint oldOffset = [scrollView contentOffset];   
scrollView.frame = CGRectMake(newFrame); 
[scrollView setContentOffset:oldOffset];   

2) एनीमेशन के बिना ऑफ़सेट परिवर्तन लागू करें। अपने keyboardWasShown में, बदल [self setContentOffset:scrollPoint animated:YES]; to
[self setContentOffset:scrollPoint animated:NO];

कारण: जब एक से अधिक ऑफसेट पर एनीमेशन के साथ लागू किया जाता है, परिणाम ऑफसेट अस्पष्ट है। यहां आंतरिक विधि (_adjustContentOffsetIfNecessary) ऑफ़सेट परिवर्तन लागू करती है और दूसरा आपके कोड द्वारा किया जाता है।आप इस नोटिस यदि आप सभी ऑफसेट UIScrollView प्रतिनिधि विधि में लागू किया जा रहा प्रवेश करने का प्रयास कर सकते हैं:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@" offset: %@", NSStringFromCGPoint(scrollView.conentOffset)) 
} 

मुझे पता है कि अगर यह मदद करता है करते हैं।

+0

@ हुरेय इम ने सुझाव देने में मदद की? यदि नहीं, तो कृपया – Tatvamasi

+0

अपडेट करें लंबे प्रतिक्रिया समय के लिए खेद है। इसने इसे हल नहीं किया। मैं setContentOffset विधियों को ओवरराइड करता हूं और उनके अंदर एक लॉगिंग स्टेटमेंट था - उन्हें नहीं कहा जा रहा था, जो यह इंगित करता है कि यह एक अभिभावक वर्ग स्क्रॉलिंग कर रहा है। –

2

scrollViewDidScroll प्रतिनिधि विधि जांच का जवाब देने के लिए एक संभावित कार्यवाही हो सकती है यह देखने के लिए कि UITextField फिर से छिपा हुआ है, फिर आवश्यक होने पर फिर से स्क्रॉल करें। एक हैक की तरह लगता है, लेकिन ऐसा लगता है कि UIScrollView ऑटो स्क्रॉलिंग व्यवहार आपके रास्ते में हो रहा है, और यदि इसे सीधे प्रभावित करने का कोई तरीका नहीं है, तो इसका एकमात्र विकल्प इसके आसपास काम करना है। नुकसान भी है, हालांकि, यदि आप ऐसा करते हैं तो यह दो बार स्क्रॉल प्रतीत होता है।

यदि ऑटो-स्क्रॉलिंग व्यवहार केवल तब होता है जब UITextField स्क्रीन के किनारे से बाहर फैलता है, तो आप स्क्रीन के किनारे से आगे बढ़ने की तरह दिखने पर फ़ील्ड को पूरी तरह से दृश्यमान रहने के लिए भी स्थानांतरित कर सकते हैं।

+0

यदि यह नीचे आता है, तो मैं इस तरह एक हैक का सहारा लेगा, लेकिन मैं नहीं चाहूंगा। वैसे भी एक अच्छे जवाब के लिए +1। –