La altura en retrato y la altura en paisaje medida en puntos.
La altura en retrato y la altura en paisaje medida en puntos.
Respuestas:
Usé el siguiente enfoque para determinar el marco del teclado en iOS 7.1.
En el método init de mi controlador de vista, me registré para UIKeyboardDidShowNotification
:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Luego, utilicé el siguiente código keyboardOnScreen:
para obtener acceso al marco del teclado. Este código obtiene el userInfo
diccionario de la notificación y luego accede al NSValue
asociado con UIKeyboardFrameEndUserInfoKey
. Luego puede acceder al CGRect y convertirlo a las coordenadas de la vista de su controlador de vista. A partir de ahí, puede realizar los cálculos que necesite en función de ese marco.
-(void)keyboardOnScreen:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGRect rawFrame = [value CGRectValue];
CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
}
Rápido
Y la implementación equivalente con Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
@objc
func keyboardDidShow(notification: Notification) {
guard let info = notification.userInfo else { return }
guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = frameInfo.cgRectValue
print("keyboardFrame: \(keyboardFrame)")
}
Recuerde que, con iOS 8, el tamaño del teclado en pantalla puede variar. No asuma que el teclado en pantalla siempre estará visible (con una altura específica ) o invisible.
Ahora, con iOS 8, el usuario también puede activar y desactivar el área de predicción de texto ... y cuando lo hagan, volverá a iniciar el keyboardWillShow
evento de una aplicación .
Esto va a romper un montón de ejemplos de código de legado, que recomendó que escriben un keyboardWillShow
evento, que se limite a medir la altura actual del teclado en pantalla y cambiar su control hacia arriba o hacia abajo en la página de esta cantidad (absoluta).
En otras palabras, si ve algún código de muestra, que solo le dice que agregue un keyboardWillShow
evento, mida la altura del teclado y luego cambie el tamaño de las alturas de sus controles en esta cantidad, esto ya no siempre funcionará.
En mi ejemplo anterior, utilicé el código de muestra del siguiente sitio, que anima el constant
valor de las restricciones verticales .
En mi aplicación, agregué una restricción a mi UITextView
, configurada en la parte inferior de la pantalla. Cuando apareció la pantalla por primera vez, guardé esta distancia vertical inicial.
Luego, cada vez keyboardWillShow
que se inicia mi evento, agrego la (nueva) altura del teclado a este valor de restricción original (para que la restricción cambie el tamaño de la altura del control).
Si. Es feo.
Y estoy un poco molesto / sorprendido de que el AutoLayout horriblemente doloroso de XCode 6 no solo nos permita unir la parte inferior de los controles a la parte inferior de la pantalla o la parte superior del teclado en pantalla.
Quizás me estoy perdiendo algo.
Aparte de mi cordura.
La altura del teclado es de 216 puntos para el modo vertical y 162 puntos para el modo horizontal.
nota de la versión: esto ya no tiene valor en iOS 9 y 10, ya que admiten tamaños de teclado personalizados.
Esto depende del modelo y la barra QuickType:
La altura del teclado depende del modelo, la barra QuickType, la configuración del usuario ... El mejor enfoque es calcular dinámicamente:
Swift 3.0
var heightKeyboard : CGFloat?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}
func keyboardShown(notification: NSNotification) {
if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
let rawFrame = (infoKey as AnyObject).cgRectValue {
let keyboardFrame = view.convert(rawFrame, from: nil)
self.heightKeyboard = keyboardFrame.size.height
// Now is stored in your heightKeyboard variable
}
}
No puedo encontrar la última respuesta, así que lo verifico todo con el simulador. (IOS 11.0)
Dispositivo | Altura de la pantalla | Retrato | Paisaje
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0
iPhone 6 plus, iPhone 7 plus, iPhone 8 plus | 736,0 | 226,0 | 162,0
iPad 5.a generación, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0
¡Gracias!
iPhone
Tamaños del teclado:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.
3.6 +, 6S +, 7+, 8+: (414 × 736) keyboardSize = (0.0, 465.0, 414.0, 271.0)
4.XS, X: (375 X 812) keyboardSize = (0.0, 477.0, 375.0, 335.0)
5.XR, XSMAX ((414 x 896) keyboardSize = (0.0, 550.0, 414.0, 346.0)