UIKit पोस्ट UIKeyboardWillShowNotification
जब यह कीबोर्ड दिखाता है, और UIKeyboardWillHideNotification
जब यह कीबोर्ड छुपाता है। इन अधिसूचनाओं में आपके UITextField
को ठीक से एनिमेट करने के लिए आवश्यक सभी चीज़ें शामिल हैं।
मान लें कि UITextField
myTextField
नामक एक संपत्ति में है।
सबसे पहले, आपको कहीं भी अधिसूचनाओं के लिए पंजीकरण करने की आवश्यकता है। जहां आप पंजीकरण करते हैं, इस पर निर्भर करता है कि 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.frame
myTextField.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];
}
धन्यवाद। धन्यवाद। धन्यवाद। धन्यवाद। थोड़ा बदलाव के साथ, मैंने यह काम किया है और यह सुपर स्लिम दिख रहा है। – iosfreak
@rob mayoff समस्या तब होती है जब मेरे पास 'UITabBar' है। जब कीबोर्ड 'UITextField' को 'UITabBar' के नीचे स्लाइड करेगा। क्यूं कर? –
यदि आपके पास टैब बार है, तो जब कीबोर्ड छुपा रहा है तो आपको कीबोर्ड के फ्रेम के बजाय टैब बार के फ्रेम के आधार पर 'newTextFieldFrame' की गणना करने की आवश्यकता है। –