iPhone कीबोर्ड कवर UITextField


120

मेरे पास एक ऐप है, जहां इंटरफ़ेस बिल्डर में , मैंने एक सेट किया है UIViewजिसमें दृश्य के निचले भाग के पास एक टेक्स्ट फ़ील्ड है। जब मैं एप्लिकेशन चलाता हूं और उस फ़ील्ड में टेक्स्ट दर्ज करने का प्रयास करता हूं, तो कीबोर्ड फ़ील्ड के ऊपर से स्लाइड करता है, इसलिए मैं यह नहीं देख सकता कि मैं तब तक टाइप कर रहा हूं जब तक मैं फिर से कीबोर्ड को छिपा नहीं देता।

क्या किसी और ने इस समस्या में भाग लिया है और इसे हल करने का एक अच्छा तरीका पाया है कि या तो माता-पिता के दृश्य को स्क्रॉल किए बिना या पाठ क्षेत्र को स्क्रीन पर आगे बढ़ाएं?


जवाबों:


290

सामान्य समाधान एक एनीमेशन के साथ क्षेत्र (और इसके ऊपर सब कुछ) को स्लाइड करना है, और जब आप कर रहे हैं तब वापस नीचे। आपको टेक्स्ट फ़ील्ड और कुछ अन्य वस्तुओं को किसी अन्य दृश्य में डालने और एक इकाई के रूप में दृश्य को स्लाइड करने की आवश्यकता हो सकती है। (मैं इन चीजों को "प्लेट्स" के रूप में "टेक्टोनिक प्लेट्स" कहता हूं, लेकिन यह सिर्फ मेरे लिए है)। लेकिन यहाँ सामान्य विचार है अगर आपको कल्पना करने की आवश्यकता नहीं है।

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

12
यह प्यार करो कि आपने कोड के लिए लिंक पोस्ट नहीं किया, लेकिन कोड ही।
बेन कॉफमैन

2
कोड के महान बिट। यह काम या कुछ भी करने के लिए इसे संपादित करने के लिए नहीं था। धन्यवाद ~
जेम्स

5
यह नीचे के रूप में स्क्रीन के सभी को कवर करने के लिए उपयोगी है: const int आंदोलनडिस्टेंस = textField.frame.origin.y / 2; // रूप में की जरूरत ट्वीक
conecon

3
मुझे यह उल्लेख करना होगा कि "यदि आप iOS 4 या उसके बाद के लिए कोई एप्लिकेशन लिख रहे हैं, तो आपको अपनी सामग्री को अपनी सामग्री के लिए ब्लॉक-आधारित विधियों का उपयोग करना चाहिए।" से संदर्भित: developer.apple.com/library/ios/#documentation/windowsviews/…
Mathieu

1
यह मिला और यह एक ही मुद्दे पर चर्चा करता है डेवलपर
।apple.com

38

यह मेरे लिए uitextfields फिसलने के लिए अद्भुत काम किया

विशेष रूप से इसमें पाठ क्षेत्र की स्थिति के आधार पर स्लाइड एनीमेशन दूरी की गणना करने का लाभ है।


यह भी खूब रही। आपको प्रत्येक पाठ क्षेत्र के लिए कुछ 'मूवमेंट डिस्टेंस' को चुनना नहीं है - यह आपके लिए गणना की जाती है।
jlstrecker

अब तक का सबसे अच्छा समाधान। घटना तंत्र!
मरछी

1
IPad पर भी बढ़िया काम करता है। मैंने अभी PORTRAIT_KEYBOARD_HEIGHT = 264 और LANDSCAPE_KEYBOARD_HEIGHT = 352 अपडेट किया है। महान लिंक। धन्यवाद।
खोन लिउ

उपरोक्त लिंक सिर्फ मेरा दिन बना! लागू करने के लिए इतना सरल, निर्दोष रूप से अब तक काम करता है!
जिम्मीजैम ने

1
इस विषय के बारे में यह स्पष्टीकरण सबसे अच्छा है। अन्य ट्यूटोरियल टेबल व्यू, स्क्रॉल व्यू आदि का उपयोग करते हैं। यह वास्तव में किसी भी अन्य जटिलताओं, सादे और सरल में शामिल किए बिना काम करता है। इस स्रोत को साझा करने के लिए धन्यवाद।
रेनेक्सैंड्रो

28

IQKeyboardManager आपके लिए CODE के NO LINE के साथ ऐसा करता है , केवल संबंधित स्रोत फ़ाइल को प्रोजेक्ट के लिए ड्रैग और ड्रॉप करने की आवश्यकता है। IQKeyboardManager भी समर्थन उपकरण अभिविन्यास , स्वत: UIToolbar प्रबंधन , keyboardDistanceFromTextField से अधिक आपको लगता है और भी बहुत कुछ।

यहाँ छवि विवरण दर्ज करें

यहाँ नियंत्रण प्रवाह चार्ट है: नियंत्रण प्रवाह चार्ट

चरण 1: - के वैश्विक सूचनाएं गया UITextField, UITextViewऔर UIKeyboardएक सिंगलटन वर्ग में। मैंने इसे IQKeyboardManager कहा ।

Step2: - यदि पाया जाता है UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationया UITextViewTextDidBeginEditingNotificationसूचनाएं मिलती हैं, तो पदानुक्रम topMostViewControllerसे उदाहरण प्राप्त करने का प्रयास करें UIWindow.rootViewController। इसे ठीक से उजागर UITextField/ करने के लिए UITextView, topMostViewController.viewफ्रेम को समायोजित करने की आवश्यकता है।

Step3: -topMostViewController.view पहले उत्तर में UITextField/ के संबंध में अनुमत प्रत्याशित चाल दूरी UITextView

Step4: -topMostViewController.view.frame अपेक्षित चाल दूरी के अनुसार ऊपर / नीचे चले ।

Step5: - यदि पाया गया है UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationया UITextViewTextDidEndEditingNotificationअधिसूचना है, तो फिर topMostViewControllerसे UIWindow.rootViewControllerपदानुक्रम से उदाहरण प्राप्त करने का प्रयास करें ।

Step6: -topMostViewController.view जिसकी मूल दूरी परेशान है उसे उसकी मूल स्थिति में पुनर्स्थापित करने की आवश्यकता है।

Step7: -topMostViewController.view.frame अशांत दूरी के हिसाब से पुनर्स्थापित किया गया।

Step8 : - ऐप लोड पर इंस्टेंटिएटेड सिंगलटन IQKeyboardManager वर्ग उदाहरण है, इसलिए ऐप में प्रत्येक UITextField/ UITextViewअपेक्षित चाल दूरी के अनुसार स्वचालित रूप से समायोजित हो जाएगा।

बस इतना ही


स्वीकृत उत्तर मेरे लिए काम नहीं कर रहा था। लेकिन यह एक करता है।
शिक्षार्थी

@ZaEeMZaFaR IQKeyboardManager iPad के लिए भी अनुकूलित है। क्या आप कृपया लाइब्रेरी गिथब रेपो पर एक समस्या को खोल सकते हैं और iPad के साथ समस्या का प्रदर्शन करते हुए डेमो प्रोजेक्ट अपलोड कर सकते हैं?
मोहम्मद इफ्तेखार कुरैशी

जवाब के लिए धन्यवाद। मैं यह करूंगा कि यदि समस्या बनी रहती है, तो इससे पहले कि आप टिप्पणी करें मैं सोच रहा था कि IQKeyboardManager सार्वभौमिक डिवाइस के लिए नहीं है।
ज़ेमे ज़ाफरा

अधिक जांच-पड़ताल करके, सिम्युलेटर पर आईपैड के साथ इसका काम ठीक है लेकिन वास्तविक आईपैड डिवाइस पर नहीं। IPhone पर पूरी तरह से ठीक काम कर रहा है (डिवाइस + सिम्युलेटर)। मामला क्या हो सकता है ?
ज़ेमे ज़ाफरा

जैसा कि मैंने पहले कहा था, आपको अपने आईओएस और डिवाइस संस्करण विवरण के साथ डेमो प्रोजेक्ट के साथ जीथब रेपो पर एक मुद्दा उठाना चाहिए, इसलिए हम इस मुद्दे पर गौर कर सकते हैं।
मोहम्मद इफ्तेखार कुरैशी

7

Amgrammer उत्तर पर विस्तार करने के लिए, यहां एक नमूना वर्ग दिया गया है:

LoginViewController.h

@interface LoginViewController : UIViewController <UITextFieldDelegate> {

}

@property (nonatomic, retain) IBOutlet UITextField    *emailTextField;
@property (nonatomic, retain) IBOutlet UITextField    *passwordTextField;

सूचना हम "UITextFieldDelegate" को लागू कर रहे हैं

LoginViewController.m

@implementation LoginViewController
@synthesize emailTextField=_emailTextField;
@synthesize passwordTextField=_passwordTextField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        //Register to receive an update when the app goes into the backround
        //It will call our "appEnteredBackground method
        [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(appEnteredBackground)
                                                 name:UIApplicationDidEnterBackgroundNotification
                                               object:nil];
    }
    return self;
}


- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
//This is called when the app goes into the background.
//We must reset the responder because animations will not be saved
- (void)appEnteredBackground{
    [self.emailTextField resignFirstResponder];
    [self.passwordTextField resignFirstResponder];
}

+1 का उल्लेख करने के लिए UIApplicationDidEnterBackgroundNotification, अन्यथा यह अधिक नीचे की ओर जाएगा यदि एक होम बटन दबाए और फिर से ऐप में आए, जिससे यह बदसूरत और छोटी गाड़ी में हो।
आदिल सूमरो

7

कैसे आधिकारिक समाधान के बारे में: कीबोर्ड के नीचे स्थित सामग्री चलती है

आपकी सामग्री को समायोजित करने में आम तौर पर एक या एक से अधिक विचारों को अस्थायी रूप से आकार देना और उन्हें स्थान देना शामिल होता है ताकि पाठ ऑब्जेक्ट दिखाई दे। कीबोर्ड के साथ टेक्स्ट ऑब्जेक्ट को प्रबंधित करने का सबसे सरल तरीका उन्हें UIScrollView ऑब्जेक्ट (या UITableView जैसे इसके उपवर्गों में से एक) के अंदर एम्बेड करना है। जब कीबोर्ड प्रदर्शित होता है, तो आपको केवल इतना करना है कि स्क्रॉल दृश्य के सामग्री क्षेत्र को रीसेट करें और वांछित टेक्स्ट ऑब्जेक्ट को स्थिति में स्क्रॉल करें। इस प्रकार, UIKeyboardDidShowNotification के जवाब में, आपका हैंडलर तरीका निम्नलिखित कार्य करेगा:

  1. कीबोर्ड का आकार प्राप्त करें।
  2. कीबोर्ड स्क्रॉल द्वारा अपने स्क्रॉल दृश्य के नीचे की सामग्री को समायोजित करें।
  3. दृश्य में लक्ष्य पाठ फ़ील्ड स्क्रॉल करें।
// 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 app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

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

यह आधिकारिक समाधान अब यहां एक नियंत्रण में लिपटा हुआ है: - stackoverflow.com/a/17707094/1582217
मोहम्मद इफ्तिखार कुरैशी

आइडिया अच्छा है, लेकिन 'contentInset' प्रॉपर्टी यहां मदद नहीं करती है, coz contentInset आपको सिर्फ पेडिंग इफेक्ट प्रदान करेगी: stackoverflow.com/a/10049782/260665
Raj Pawan Gumdal

@ राज, यह वह मामला हो सकता है जिसे मैं IQKeyboardManager पर देख सकता हूं, लेकिन फिर भी कोई भी आधिकारिक IQKeyboardManager github रिपॉजिटरी पर सामग्रीइंटरनेट संपत्ति के मुद्दे के बारे में किसी भी मुद्दे को नहीं खोलता है, इसलिए मुझे लगता है कि यह काम कर रहा है।
मोहम्मद इफ्तेखार कुरैशी

7

मुझे UITableView टेक्स्टफिल्ड सेल में एक ही मुद्दे का सामना करना पड़ता है । मैं कीबोर्ड अधिसूचना को सुनने के लिए निम्नलिखित विधि को लागू करके इस मुद्दे को हल करता हूं।

यहां सूचनाओं के लिए पर्यवेक्षक:

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

नीचे दिए गए फ़ंक्शन का उपयोग करके उन सूचनाओं को संभालें:

(void)keyboardWasShown:(NSNotification*)aNotification 
(void)keyboardWillBeHidden:(NSNotification*)aNotification 

1
लिंक टूट गया है। कृपया भविष्य में एक स्वतंत्र समाधान सहित विचार करें!
15

5

इसकी जांच करें। कोई झंझट नहीं।

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

TPKeyboardAvoiding


@NANNAV - जब आप किसी उत्तर को संशोधित करने के लिए सुझाव देते हैं तो कृपया टिप्पणी प्रदान करें।
सिक्योरिटी हाउंड

5

नीचे एमग्राममर के उत्तर का एक स्विफ्ट संस्करण है। इसके अलावा, UIKeyboardWillShowNotification घटना का उपयोग करते हुए एक भिन्नता, क्योंकि मुझे दृश्य को स्थानांतरित करने से पहले कीबोर्ड के आकार को जानने की आवश्यकता थी।

var keyboardHeight:CGFloat = 0

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChange:", name: UIKeyboardWillShowNotification, object: nil)
}

func textFieldDidBeginEditing(textField: UITextField) {
    //keyboardWillChange (below) is used instead of textFieldDidBeginEditing because textFieldDidBeginEditing
    //is called before the UIKeyboardWillShowNotification necessary to determine the keyboard height.
}

func textFieldDidEndEditing(textField: UITextField) {
    animateTextField(false)
}

func animateTextField(textFieldUp:Bool) {
    let movementDistance:CGFloat = keyboardHeight
    let movementDuration = 0.3

    let movement:CGFloat = (textFieldUp ? -movementDistance : movementDistance)

    UIView.beginAnimations("anim", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)
    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    UIView.commitAnimations()
}

func keyboardWillChange(notification:NSNotification) {
    let keyboardRect:CGRect = ((notification.userInfo![UIKeyboardFrameEndUserInfoKey])?.CGRectValue)!
    keyboardHeight = keyboardRect.height
    animateTextField(true)
}

4

बिना किसी अस्पष्ट पाठ को संपादित करने में बहुत बढ़िया वाक़िफ़ था (लिंक डेड अब, यहाँ एक वेबैक लिंक है: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / संपादन-textfields-without-obscuring.html )। यह दिखाता है कि मौजूदा को कीबोर्ड UIViewपर ले जाने के लिए UIScrollView, और कीबोर्ड दिखाई देने पर इसे स्वचालित रूप से स्क्रॉल करना है।

नीचे दिए गए UIScrollViewनियंत्रण (जैसे UITabBar) के लिए सही ऊंचाई की गणना करने के लिए मैंने इसे थोड़ा अपडेट किया है UIScrollBar। देखें पोस्ट अद्यतन करने UIView


2

यहाँ Xcode5, iOS7 का उपयोग कर एक समाधान है:

UITextfieldDelegate और एनीमेशन ब्लॉक का उपयोग करें।

यह ViewController के लिए लगभग सभी कोड है, लेकिन मैं अभी भी कुछ हद तक प्रतिनिधि पैटर्न (मेरे जैसे) के साथ अपरिचित लोगों के लिए प्रतिनिधि कोड को शामिल करना चाहता था। जब आपने टेक्स्टव्यू से दूर टैप किया तो मैंने कीबोर्ड को छिपाने के लिए कोड भी शामिल किया।

आप उन दृश्यों (बटन, टेक्स्टफील्ड, इत्यादि) को ऊपर ले जा सकते हैं, जहाँ आप उन्हें वापस लाना सुनिश्चित करेंगे (+100 बाद में -100)।

@interface ViewController () <UITextFieldDelegate>
@property (strong, nonatomic) IBOutlet UITextField *MyTextField;

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.MyTextField.delegate = self;

}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
      NSLog(@"text began editing");

      CGPoint MyPoint = self.MyTextField.center;

      [UIView animateWithDuration:0.3
                    animations:^{

                    self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y - 100);
                                }];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
     NSLog(@"text ENDED editing");

     CGPoint MyPoint = self.MyTextField.center;

     [UIView animateWithDuration:0.3
                 animations:^{

     self.MyTextField.center = CGPointMake(MyPoint.x, MyPoint.y + 100);
                             }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     [self.view endEditing:YES];
}

1

मुझे लगता है कि एक तरह से आपके पूरे विचारों की स्थिति (x, y) से (x, y-keybaardHeight) को स्थानांतरित करने के लिए होगा जब टेक्स्टफील्ड पर क्लिक किया जाता है और कीबोर्ड के खारिज होने पर इसे वापस रख दिया जाता है, तो यह देखने में थोड़ा अजीब लग सकता है ऊपर आता है (शायद यह बुरा होगा यदि आप इसे चेतन करते हैं)।

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}

नहीं यह नहीं। यदि उपयोगकर्ता पहले टेक्स्टफील्ड पर टैप करता है तो यह दृश्य क्षेत्र के ऊपर मिलेगा।
लोलोल

0

Amgrammer के समाधान के अतिरिक्त, यदि आप पोर्ट्रेट मोड में cocos2d का उपयोग कर रहे हैं तो इस लाइन को बदलें:

self.view.frame = CGRectOffset(self.view.frame, 0, movement);

इसके लिए:

[CCDirector sharedDirector].openGLView.frame = CGRectOffset([CCDirector sharedDirector].openGLView.frame, movement, 0);

आप लैंडस्केप मोड में Cocos2d का उपयोग कर रहे हैं, तो ऊपर परिवर्तन करने और स्विच upमें मूल्यों textFieldDidBeginEditing:औरtextFieldDidEndEditing:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self animateTextField:textField up:NO];
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self animateTextField:textField up:YES];
}

0

मेरे पास एक ही समस्या थी और GTKeyboardHelper को एक आसान रास्ता मिल गया।

अपनी परियोजना में रूपरेखा को खींचने और छोड़ने के बाद, हेडर फ़ाइल को शामिल करें। उदाहरण परियोजना डाउनलोड करें और खोलें, फिर "कीबोर्ड हेल्पर" ऑब्जेक्ट को अपने प्रोजेक्ट के इंटरफ़ेस बिल्डर में xib से ऑब्जेक्ट सेक्शन में ऑब्जेक्ट सेक्शन में खींचें।

"कीबोर्ड हेल्पर" के बच्चे होने के लिए अपने सभी विचारों को खींचें और छोड़ें।


0

खींचें और ड्रॉप फ्रेमवर्क जो मैं अपनी परियोजनाओं में उपयोग करता हूं। जब आप पहले प्रत्युत्तर के बाहर टैप करते हैं या जब आप स्क्रॉल करते हैं तो स्वचालित बर्खास्तगी का समर्थन करता है।

GTKeyboardHelper


0

आवश्यकतानुसार दृश्य को ऊपर और नीचे स्लाइड करें:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.currentTextField resignFirstResponder];
    return YES;
}

- (void) animateTextField:(UITextField*) textField up:(BOOL)up {
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView animateWithDuration:movementDuration animations:^{
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }];
}

स्थापित करने के लिए मत भूलना selfएक के रूप में UITextFieldDelegateऔर वास्तविक पाठ फ़ील्ड के रूप में delegate

(अम्मग्रामग्राम के लिए धन्यवाद, यह एनिमेशन के लिए ब्लॉक का उपयोग करके सिर्फ एक छोटा उत्तर है)


0

आप चाहते हैं तो मेरे पास कुछ और है। यहां मुद्दा यह है कि आप जिस पाठ क्षेत्र का संपादन कर रहे हैं, उस पर अपना यूआईईवाईई केंद्र स्थापित करना चाहते हैं।

इससे पहले, आपको अपने INITIAL_CENTER को , CGPoint के रूप में , self.view.center से और अपने INITIAL_VIEW को एक सेल्फ संपत्ति से CGRect के रूप में सहेजना होगा ।

आप इस तरह से एक विधि बना सकते हैं:

- (void) centerOn: (CGRect) fieldFrame {

    // Set up the center by taking the original view center
    CGPoint center = CGPointMake(INITIAL_CENTER.x,
                             INITIAL_CENTER.y - ((fieldFrame.origin.y + fieldFrame.size.height/2) - INITIAL_CENTER.y));


    [UIView beginAnimations:@"centerViewOnField" context:nil];
    [UIView setAnimationDuration:0.50];

    if (CGRectEqualToRect(fieldFrame,INITIAL_VIEW)) {
        self.view.frame = INITIAL_VIEW;
        [self.view setCenter:INITIAL_CENTER];
    } else {
        [self.view setCenter:center];
    }


    [UIView commitAnimations];
}

फिर, अपने UITextFieldDelegate पर , आपको निम्नलिखित तरीकों में centerOn: (CGRect) पर कॉल करना होगा :

textFieldDidBeginEditing: (UITextField *) एक पैरामीटर के रूप में, उस टेक्स्ट फ़ील्ड का फ्रेम जिसे आप केंद्र में रखना चाहते हैं।

और आपको इसे अपने ईवेंट हैंडलर में कॉल करना है, जहां आप अपना कीबोर्ड बंद करते हैं,

textFieldDidEndEditing: (UITextField *) इसे करने के तरीकों में से एक हो सकता है, INITIAL_VIEW को केंद्र के एक पैरामीटर के रूप में रखकर: (CGRect)


0

मैं iOS के नए संस्करणों पर विश्वास करता हूं (6.1+, संभवतः पहले भी), अंतर्निहित दृश्य, कम से कम यूआईटेबल व्यू के लिए, जब कीबोर्ड पॉप हो जाता है तो ऑटो-सिकुड़ जाता है। इसलिए आपको केवल पाठ फ़ील्ड को उस दृश्य में दिखाई देने की आवश्यकता है। इन init:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

फिर:

- (void)keyboardWasShown:(NSNotification*)notification
{
    // Scroll the text field into view so it's not under the keyboard.
    CGRect rect = [self.tableView convertRect:inputView.bounds fromView:inputView];
    [self.tableView scrollRectToVisible:rect animated:YES];
}

0

https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example मुझे उम्मीद है कि इस समाधान से मदद मिली। वे सभी स्विफ्ट 3 में लिखे गए हैं।

//
//  ViewController.swift
//  Shift Keyboard Example
//
//  Created by Zulwiyoza Putra on 11/23/16.
//  Copyright © 2016 Zulwiyoza Putra. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    
    //connecting textfield from storyboard
    @IBOutlet weak var textField: UITextField!
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        subscribeToKeyboardNotifications()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        self.textField.delegate = self
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        unsubscribeFromKeyboardNotifications()
    }
    
    //Hide keyboard after finished editing
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
    
    //Setup view before keyboard appeared
    func keyboardWillAppear(_ notification:Notification) {
        view.frame.origin.y = 0 - getKeyboardHeight(notification)
    }
    
    //Setup view before keyboard disappeared
    func keyboardWillDisappear(_ notification: Notification) {
        view.frame.origin.y = 0
    }
    
    //Getting keyboard height
    func getKeyboardHeight(_ notification:Notification) -> CGFloat {
        let userInfo = notification.userInfo
        let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue // of CGRect
        return keyboardSize.cgRectValue.height
    }
    
    //Subscribing to notifications to execute functions
    func subscribeToKeyboardNotifications() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: .UIKeyboardWillHide, object: nil)
    }
    
    //Unsubscribing from notifications
    func unsubscribeFromKeyboardNotifications() {
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
    }
    
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.