iphone आईफोन कीबोर्ड यूआईटीएक्स्टफाल्ड को कवर करता है




keyboard uitextfield (16)

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

GTKeyboardHelper

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

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


एक्सकोड 5, आईओएस 7 का उपयोग कर एक समाधान यहां दिया गया है:

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

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

आप विचारों (बटन, टेक्स्टफील्ड, इत्यादि) को उतना ऊंचा स्थानांतरित कर सकते हैं जितना आप चाहते हैं कि उन्हें वापस जगह में रखें (+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];
}

मुझे लगता है कि एक और तरीका आपकी पूरी दृश्य स्थिति (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;
}

इसकी जांच करें। आपके लिए कोई परेशानी नहीं

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

TPKeyboardAvoiding


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

आपकी सामग्री को समायोजित करने में आम तौर पर एक या अधिक विचारों का अस्थायी रूप से आकार बदलना और उन्हें स्थितिबद्ध करना शामिल है ताकि टेक्स्ट ऑब्जेक्ट दिखाई दे। कुंजीपटल के साथ टेक्स्ट ऑब्जेक्ट्स को प्रबंधित करने का सबसे आसान तरीका उन्हें 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;
}

मुझे एक ही समस्या थी और GTKeyboardHelper को एक आसान तरीका साबित हुआ।

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

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



मैं आईओएस के नए संस्करणों (6.1+, संभवतः पहले भी) पर विश्वास करता हूं, अंतर्निहित दृश्य, कम से कम UITableView के लिए, कीबोर्ड पॉप अप होने पर ऑटो-सिंक्रनाइज़ करता है। तो आपको केवल उस दृश्य में टेक्स्ट फ़ील्ड दिखाई देने की आवश्यकता है। 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];
}

नीचे Amagrammer के जवाब का एक तेज संस्करण है। इसके अलावा, 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)
}

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

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];
}

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

- (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 रूप में सेट करना न भूलें।

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


मुझे 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 

यह मेरे लिए uitextfields फिसलने के लिए चमत्कार काम किया

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


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

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

इसके लिए:

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

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

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

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

IQKeyboardManager आपके लिए कोड की कोई लाइन नहीं है , केवल परियोजना को संबंधित स्रोत फ़ाइल को खींचने और छोड़ने की आवश्यकता है। IQKeyboardManager डिवाइस ओरिएंटेशन , स्वचालित यूटूलबार प्रबंधन , IQKeyboardManager और आपके विचार से कहीं अधिक का समर्थन करता है।

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

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

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

चरण 3: - पहले उत्तर दिए गए UITextField / UITextView संबंध में topMostViewController.view की गणना की गई दूरी की गणना की गई।

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

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

topMostViewController.view 6: - topMostViewController.view की गणना की गई दूरी को topMostViewController.view जिसे इसकी मूल स्थिति में बहाल करने की आवश्यकता है।

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

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

बस इतना ही


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

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





uitextfield