objective-c iphone

objective c - Cómo obtener el tamaño de UIKeyboard con Apple iPhone SDK



textfield swift 4 (4)

¿Hay alguna forma de obtener el tamaño del UIKeyboard programáticamente? 216.0f altura y 162.0f altura en el paisaje.

Los siguientes parecen estar privados. ¿Hay alguna manera de que funcione sin ninguna advertencia tanto en 3.0 iPhone OS SDK y 4.0 iPhone OS SDK para hacer esto ...

CGSize keyBoardSize = [[[note userInfo] objectForKey:UIKeyboardBoundsUserInfoKey]CGRectValue].size;

Gracias, Tharindu


Así es como finalmente hice trabajos. Combiné sugerencias y códigos de diferentes respuestas. Características: descartar el teclado, mover los campos de texto sobre el teclado mientras edita y configurar el tipo de devolución del teclado "Siguiente" y "Hecho". REPLACE "..." con más campos

static const CGFloat ANIMATION_DURATION = 0.4; static const CGFloat LITTLE_SPACE = 5; CGFloat animatedDistance; CGSize keyboardSize; @interface ViewController () <UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT; .....// some other text fields @property (weak, nonatomic) IBOutlet UITextField *emailTXT; @end @implementation ViewController - (void)viewDidLoad{ ..... // add tap gesture to help in dismissing keyboard UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapScreen:)];// outside textfields [self.view addGestureRecognizer:tapGesture]; // set text fields return key type to Next, last text field to Done [self.firstNameTXT setReturnKeyType:UIReturnKeyNext]; ..... [self.emailTXT setReturnKeyType:UIReturnKeyDone]; // set text fields tags [self.firstNameTXT setTag:0]; ....// more text fields [self.emailTXT setTag:5]; // add keyboard notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; } // dismiss keyboard when tap outside text fields - (IBAction)tapScreen:(UITapGestureRecognizer *)sender { if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder]; ... if([self.emailTXT isFirstResponder])[self.emailTXT resignFirstResponder]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField{ if(textField.returnKeyType==UIReturnKeyNext) { // find the text field with next tag UIView *next = [[textField superview] viewWithTag:textField.tag+1]; [next becomeFirstResponder]; } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) { [textField resignFirstResponder]; } return YES; } // Moving current text field above keyboard -(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{ CGRect viewFrame = self.view.frame; CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField]; CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view]; CGFloat textFieldBottomLine = textFieldRect.origin.y + textFieldRect.size.height + LITTLE_SPACE;// CGFloat keyboardHeight = keyboardSize.height; BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE; if (isTextFieldHidden) { animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ; viewFrame.origin.y -= animatedDistance; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } return YES; } -(void) restoreViewFrameOrigionYToZero{ CGRect viewFrame = self.view.frame; if (viewFrame.origin.y != 0) { viewFrame.origin.y = 0; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [UIView setAnimationDuration:ANIMATION_DURATION]; [self.view setFrame:viewFrame]; [UIView commitAnimations]; } } -(void)keyboardDidShow:(NSNotification*)aNotification{ NSDictionary* info = [aNotification userInfo]; keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; } -(void)keyboardDidHide:(NSNotification*)aNotification{ [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its zero origin } @end


En su lugar, debe usar UIKeyboardWillChangeFrameNotification , ya que algunos teclados internacionales, como el teclado chino, cambiarán los marcos durante el uso. También asegúrese de convertir el CGRect en la vista adecuada para el uso del paisaje.

//some method like viewDidLoad, where you set up your observer. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil]; - (void)keyboardWillChange:(NSNotification *)notification { CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; //this is it! }


En veloz 4

override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(getInfo(notif:)), name: .UIKeyboardDidShow , object: nil) }

y entonces:

@objc func getInfo(notif: NSNotification) -> Void { guard let userInfo = notif.userInfo else {return} if let myData = userInfo["UIKeyboardFrameBeginUserInfoKey"] as? CGRect { print(myData.width) print(myData.height) } }


Puede obtener el tamaño del teclado del diccionario userInfo utilizando en su lugar UIKeyboardFrameBeginUserInfoKey y UIKeyboardFrameEndUserInfoKey .

Estas dos claves devuelven una instancia CGRect que contiene un CGRect que mantiene la posición y el tamaño del teclado tanto en el punto inicial como en el final de la animación show / hide del teclado.

Editar:

Para aclarar, el diccionario userInfo proviene de una instancia NSNotification . Se pasa a su método que se registre con un observador. Por ejemplo,

- (void)someMethodWhereYouSetUpYourObserver { // This could be in an init method. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationMethod:) name:UIKeyboardDidShowNotification object:nil]; } - (void)myNotificationMethod:(NSNotification*)notification { NSDictionary* keyboardInfo = [notification userInfo]; NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey]; CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue]; }

Editar 2:

Además, no olvides dealloc como observador en tu método dealloc . Esto es para evitar un bloqueo que ocurriría cuando el centro de notificaciones intente notificar a su objeto después de haber sido liberado.