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




keyboard uitextfield (14)

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

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

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

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


अमाग्रामर के समाधान के अतिरिक्त, यदि आप पोर्ट्रेट मोड में 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];
}

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


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

- (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 के लिए धन्यवाद, यह एनिमेशन के लिए ब्लॉक का उपयोग कर सिर्फ एक छोटा सा जवाब है)


एक्सकोड 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];
}


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

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

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

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


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

GTKeyboardHelper


मैं आईओएस के नए संस्करणों (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];
}

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

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


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

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

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://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)
    }
    
}





uitextfield