pro - La vista alineada con la parte superior del teclado aparece en un lugar incorrecto en el modo de barra de acceso directo iOS 9
configurar teclado ipad pro (1)
El problema es que la mayoría del código ( incluido el de Apple) ignora el hecho de que UIKeyboardFrameEndUserInfoKey es un CGRect y no un CGSize .
// ❌ Bad code, do not use
- (void)keyboardWasShown:(NSNotification*)aNotification {
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGRect bkgndRect = activeField.superview.frame;
bkgndRect.size.height += kbSize.height;
[activeField.superview setFrame:bkgndRect];
[scrollView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}
Aquí puede ver que solo se usa la altura del teclado ( kbSize.height
). El origen del rect es importante y no debe ignorarse.
Cuando el teclado está visible, este es el rect que se informa:
Cuando el teclado está en modo de barra de acceso directo, este es el rect:
Observe cómo la mayoría del teclado está fuera de pantalla, pero aún tiene la misma altura.
Para obtener el comportamiento correcto, use CGRectIntersection con los límites de la vista y el marco del teclado dentro de esa vista:
// ✅ Good code, use
CGRect keyboardScreenEndFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window];
CGRect keyboardFrame = CGRectIntersection(self.view.bounds, keyboardViewEndFrame);
CGFloat keyboardHeight = keyboardFrame.size.height; // = 55
Por este mismo motivo, UIKeyboardFrameEndUserInfoKey
debe usarse en lugar de UIKeyboardFrameBeginUserInfoKey
.
iOS 9 agrega una barra de acceso directo a la barra de iOS 8 QuickType .
Como parte de este cambio, si conecta un teclado bluetooth a un iPad, el teclado está en un modo de barra de acceso directo minimizado (que se puede simular presionando command-k en el simulador).
Tengo un código que obtiene la altura del teclado usando un método similar al siguiente:
CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height; // = 313
El problema es que cuando el teclado se alterna entre el estado expandido y colapsado, la altura sigue siendo la misma, lo que hace que mi vista aparezca en su ubicación anterior:
Comportamiento deseado:
(Observe cómo la vista roja está conectada a la parte superior del teclado)
Comportamiento real:
¿Cuál es la forma correcta de conectar la vista roja a la parte superior del teclado?