2011-08-25 18 views
7

मेरे पास एक ऐसा दृश्य है जिसमें दृश्य के शीर्ष से दृश्य फ़ील्ड दृश्य के नीचे हैं। मुझे नीचे फ़ील्ड को संपादित करते समय स्क्रॉल करने की आवश्यकता थी ताकि फ़ील्ड दिखाई दे सकें, लेकिन यह सही तरीके से काम नहीं कर रहा है।सक्रिय टेक्स्ट फ़ील्ड पर कीबोर्ड स्क्रॉल - दृश्य से बाहर स्क्रॉलिंग?

Apple docs के बाद, मैं अपने कार्यक्रम (लिस्टिंग 4-1, 4-2) में है कि कोड के सभी रखा, और मेरे हेडर फाइल को scrollView और activeField दुकानों जोड़ा गया है और उन्हें आईबी से जुड़ा हुआ।

समस्या जैसे ही मैं एक टेक्स्ट फ़ील्ड में क्लिक करता हूं, जब तक मैं कीबोर्ड को खारिज नहीं करता तब तक सभी टेक्स्ट फ़ील्ड दृश्य से बाहर नहीं जाते हैं। वे बहुत दूर स्क्रॉल करते हैं (फिर से, जहां तक ​​कोई भी फ़ील्ड दिखाई नहीं दे रहा है)।

क्या किसी को पता है कि समस्या क्या हो सकती है?

मैं यहां ऐप्पल डॉक्स से कोड डाल रहा हूं ताकि आप देख सकें कि मैं किस कोड को क्लिक करने के बिना उपयोग कर रहा हूं।

//my .h 
    IBOutlet UIScrollView *scrollView; 
    IBOutlet UITextField *activeField; 

//.m 
    // Call this method somewhere in your view controller setup code. 
    - (void)registerForKeyboardNotifications 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
       selector:@selector(keyboardWasShown:) 
       name:UIKeyboardDidShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
      selector:@selector(keyboardWillBeHidden:) 
      name:UIKeyboardWillHideNotification object:nil]; 

} 

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 

    // If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    scrollView.contentInset = contentInsets; 
    scrollView.scrollIndicatorInsets = contentInsets; 
} 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    activeField = nil; 
} 
+0

मैं क्योंकि यह संदिग्ध है, इसलिए इसमें पुन: पेश करने एप्पल से अनुमति है अपनी पोस्ट के बाहर एप्पल कोड की कॉपी-पेस्ट संपादित -

यहाँ मेरी दृष्टिकोण (थोड़ा सेब की तरह संशोधित) है। मैंने एक मॉडरेटर को देखने के लिए भी ध्वजांकित किया - मुझे यकीन नहीं है कि आधिकारिक नीति क्या है या होनी चाहिए। –

+0

@ जोश: ["उचित उपयोग,"] (http://en.wikipedia.org/wiki/Fair_use) उद्देश्यों के लिए कोड की उस छोटी राशि शायद ठीक है। –

+0

@Robert: ठीक है, धन्यवाद। जेम्स, मुझे लगता है कि इसका मतलब है कि अगर आप इसे चुनते हैं तो आपको इसे वापस रखना चाहिए। भाई के लिए खेद है। –

उत्तर

33

अद्यतन: जवाब नीचे पुरानी हो चुकी है। अभी के लिए आप UIScrollView, UITableView & में सभी प्रकार के टेक्स्ट फ़ील्ड ऑपरेशन को संभालने के लिए "TPkeyboardavoiding" लाइब्रेरी का उपयोग कर सकते हैं। इसे आज़माएं और मुझे बताएं कि किसी को भी एकीकरण में कोई समस्या है।

ओल्ड उत्तर

इस कार्यशीलता के लिए कुंजीपटल सूचनाओं के लिए रजिस्टर करने के लिए कोई जरूरत नहीं है।

// called when textField start editting. 
- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    activeField = textField; 
    [scrollView setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
} 



// called when click on the retun button. 
- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{ 


    NSInteger nextTag = textField.tag + 1; 
    // Try to find next responder 
    UIResponder *nextResponder = [textField.superview viewWithTag:nextTag]; 

    if (nextResponder) { 
     [scrollview setContentOffset:CGPointMake(0,textField.center.y-60) animated:YES]; 
     // Found next responder, so set it. 
     [nextResponder becomeFirstResponder]; 
    } else { 
     [scrollview setContentOffset:CGPointMake(0,0) animated:YES]; 
     [textField resignFirstResponder]; 
     return YES; 
    } 

    return NO; 
} 

नोट:: आदेश कीबोर्ड के ऊपर स्क्रीन सक्रिय textfield केंद्रित करने के लिए, आप केवल जैसा कि यहाँ दिखाया UIScrollView दो तरीकों में से contentOffset सेट करने के लिए सभी TextField 1,2 तरह वृद्धिशील टैग होना चाहिए, 3 और इसलिए नहीं। और प्रतिनिधि को स्वयं को सेट करें।

धन्यवाद,

+5

हैं स्क्रॉल व्यू, 'center.y' गलत स्थिति होगी। इसलिए, किसी को इस तरह कुछ उपयोग करना चाहिए, जो सही स्थिति की गणना करता है: '_scrollView.contentOffset = CGPointMake (0, [_scrollView कनवर्टपॉइंट: CGPointZero से दृश्य: टेक्स्ट फ़ील्ड] .y - 60);' – AndiDog

+0

-60 मान क्या है? –

+0

-60 ऑफसेट था जो आपके दृश्य और कीबोर्ड आकार के अनुसार परिवर्तनीय होगा। मेरे मामले में यह मूल्य मेरे लिए सबसे अच्छा था। – MinuMaster

0

यकीन प्रतिनिधि स्थापित किया गया था करने के बाद, मैं कोड के माध्यम से चला गया और सब कुछ के निर्देशांक के सभी बाहर खींचा और गणित के सभी किया है और मैन्युअल रूप से कुछ चर सेट करने के लिए किया था, लेकिन अब यह इरादे के रूप में काम करता है।

अगर किसी को भविष्य में इसके साथ मदद की ज़रूरत है तो मुझे मदद करने में खुशी होगी। मेरा ट्विटर मेरी प्रोफाइल में है।

+0

हाय जेम्स, मैं ऐप्पल के डॉक्टर का पालन करके भी एक समस्या से मुलाकात की। मेरी समस्या यह है कि जब मैं टेक्स्ट फ़ील्ड टैप करता हूं, कुछ भी नहीं होता है। स्क्रॉल बार नहीं दिखाया जाएगा और यह स्क्रॉल-सक्षम नहीं होगा। क्या आप मुझे इस पर हाथ दे सकते हैं? अग्रिम में धन्यवाद। धीमी प्रतिक्रिया के लिए – dumbfingers

+0

क्षमा करें। काम पर व्यस्त हो गया। क्या आपके पास कुछ कोड है जिसे मैं देख सकता हूं? यदि आप आईबी का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आपके सभी आउटलेट झुकाए गए हैं। – Baub

+0

हे जेम्स, आपके उत्तर के लिए धन्यवाद, मैंने आपके द्वारा पूछे जाने के कुछ ही घंटों बाद ही इस मुद्दे को हल कर लिया है। फिर भी धन्यवाद!!! – dumbfingers

6

के बाद से मुझे मिल गया, मैं का उपयोग TPKeyboardAvoiding

यह बहुत अच्छा काम कर रहा है, और सेटअप करने के लिए बहुत आसान है:

  1. आपके विचार नियंत्रक के xib
  2. सेट स्क्रॉल दृश्य की कक्षा में एक UIScrollView जोड़े पहचान निरीक्षक के माध्यम से xib में TPKeyboardAvoidingScrollView (अभी भी )
  3. उस स्क्रॉलव्यू के भीतर अपने सभी नियंत्रण रखें

यह टेक्स्ट फ़ील्ड के माध्यम से स्विच करने के लिए कीबोर्ड पर "अगला" बटन स्वचालित रूप से हुक करता है।

शुभकामनाएं!

1

@ मिनुमास्टर का दृष्टिकोण ठीक काम करता है लेकिन मैं एक सरल लेकिन सामान्यीकृत तरीका सुझाता हूं जैसे कि सेब करता है जैसे कीपैड की ऊंचाई को ध्यान में रखकर बहुत उपयोगी होता है जब हम कीबोर्ड के शीर्ष पर कस्टम टूलबार का उपयोग कर रहे होते हैं। हालांकि सेब के दृष्टिकोण here में कुछ समस्याएं हैं।

// Called when the UIKeyboardDidShowNotification is sent. 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 

// Called when the UIKeyboardWillHideNotification is sent 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 
संबंधित मुद्दे