12

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

[theTextView resignFirstResponder]; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:0.25]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
// Frame changes go here (move down 216px) 
[UIView commitAnimations]; 

[theTextView becomeFirstResponder]; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDuration:0.25]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
// Frame changes go here (move up 216px) 
[UIView commitAnimations]; 

किसी को भी करने से पहले कुछ इस तरह से किया गया है, तो मैं सेटिंग्स आप एनीमेशन को सहज बनाने और यह जाहिर होता है कि बार के शीर्ष करने के लिए "अटक जाने" है बनाने के लिए इस्तेमाल जानना चाहते हैं: यहाँ मैं क्या है है कुंजीपटल।

उत्तर

44

UIKit पोस्ट UIKeyboardWillShowNotification जब यह कीबोर्ड दिखाता है, और UIKeyboardWillHideNotification जब यह कीबोर्ड छुपाता है। इन अधिसूचनाओं में आपके UITextField को ठीक से एनिमेट करने के लिए आवश्यक सभी चीज़ें शामिल हैं।

मान लें कि UITextFieldmyTextField नामक एक संपत्ति में है।

सबसे पहले, आपको कहीं भी अधिसूचनाओं के लिए पंजीकरण करने की आवश्यकता है। जहां आप पंजीकरण करते हैं, इस पर निर्भर करता है कि myTextField को स्थानांतरित करने के लिए कौन सी वस्तु जिम्मेदार है। मेरी परियोजना में, क्षेत्र के superview जिम्मेदार है, और के बाद से मैं एक निब से मेरी यूआई लोड, मैं इसे superview के awakeFromNib में कार्य करें:

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillHideNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideOrShow:) name:UIKeyboardWillShowNotification object:nil]; 
} 

आप एक UIViewController का उपयोग करते हैं के आसपास के क्षेत्र को स्थानांतरित करने, तो आप शायद हूँ इसे viewWillAppear:animated: में करना चाहते हैं।

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
बेशक

मुश्किल सा keyboardWillHideOrShow: विधि में है:

आप अपने dealloc या viewWillDisappear:animated: में अपंजीकृत चाहिए। सबसे पहले मैं अधिसूचना से एनीमेशन पैरामीटर निकालने:

- (void)keyboardWillHideOrShow:(NSNotification *)note 
{ 
    NSDictionary *userInfo = note.userInfo; 
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]; 

    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

keyboardFrame वैश्विक समन्वय प्रणाली में है। मैं myTextField.frame रूप में एक ही समन्वय प्रणाली को फ्रेम बदलने की आवश्यकता है, और myTextField.framemyTextField.superview की समन्वय प्रणाली में है:

CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil]; 

इसके बाद, मैं फ्रेम कि मैं myTextField में ले जाना चाहते गणना। नया फ्रेम के निचले किनारे कीबोर्ड की फ्रेम के ऊपरी किनारे करने के लिए बराबर होना चाहिए:

CGRect newTextFieldFrame = self.myTextField.frame; 
    newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height; 

अंत में, मैं अपने नए फ्रेम करने के लिए myTextField चेतन, एक ही एनीमेशन पैरामीटर का उपयोग कर कि कीबोर्ड का उपयोग किया जाता है:

[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{ 
     self.myTextField.frame = newTextFieldFrame; 
    } completion:nil]; 
} 

यहाँ यह सब एक साथ रखा जाता है:

- (void)keyboardWillHideOrShow:(NSNotification *)note 
{ 
    NSDictionary *userInfo = note.userInfo; 
    NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]; 

    CGRect keyboardFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    CGRect keyboardFrameForTextField = [self.myTextField.superview convertRect:keyboardFrame fromView:nil]; 

    CGRect newTextFieldFrame = self.myTextField.frame; 
    newTextFieldFrame.origin.y = keyboardFrameForTextField.origin.y - newTextFieldFrame.size.height; 

    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{ 
     self.myTextField.frame = newTextFieldFrame; 
    } completion:nil]; 
} 
+1

धन्यवाद। धन्यवाद। धन्यवाद। धन्यवाद। थोड़ा बदलाव के साथ, मैंने यह काम किया है और यह सुपर स्लिम दिख रहा है। – iosfreak

+0

@rob mayoff समस्या तब होती है जब मेरे पास 'UITabBar' है। जब कीबोर्ड 'UITextField' को 'UITabBar' के नीचे स्लाइड करेगा। क्यूं कर? –

+0

यदि आपके पास टैब बार है, तो जब कीबोर्ड छुपा रहा है तो आपको कीबोर्ड के फ्रेम के बजाय टैब बार के फ्रेम के आधार पर 'newTextFieldFrame' की गणना करने की आवश्यकता है। –

0

यूआईटीएक्स्टफिल्ड को कीबोर्ड (एनीमेशन के साथ) पर डॉक करने के लिए, आपको ऑफसेट गणना करने की आवश्यकता है और स्क्रॉल व्यू पर ऑफसेट परिवर्तनों को लागू करने की आवश्यकता है (setContentOffset:animation: विधि का उपयोग करके UITextField को UIScrollView में रखा गया है)।

+0

यह स्क्रॉलव्यू में नहीं है। एक स्क्रॉल व्यू भी मौजूद नहीं है, यह एक UITableView है। – iosfreak

+2

@ phpnerd211: UITableView UIScrollView का उप-वर्ग है। – Andrew

5

अपने पाठ क्षेत्र सेट करें (या एक दृश्य के पाठ क्षेत्र पकड़े) क्षेत्र की inputAccessoryView के रूप में है कि आप संपादन कर रहे हैं फिर यह स्वचालित रूप से कीबोर्ड के शीर्ष से जुड़ा होगा और उचित रूप से एनिमेट करेगा।

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

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