¿Cuál es la altura del teclado en pantalla del iPhone?

84

La altura en retrato y la altura en paisaje medida en puntos.

Erik B
fuente
2
Aquí puede encontrar todas las dimensiones de un iPhone: dimensiones del iPhone
Pfitz
3
¡No use el último enlace "Dimensiones del iPhone"! Es de 2011, antes de que apareciera iOS 8, y permitía que la altura del teclado en pantalla variara.
Mike Gledhill
La altura del teclado en pantalla de @MikeGledhill varía incluso antes de iOS 8.
ReDetection
Relacionado: Si está buscando los valores reales de las alturas del teclado (por ejemplo, para fines de depuración), consulte ¿Alturas de teclado en idiomas extranjeros de iOS?
Sentido

Respuestas:

211

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 userInfodiccionario de la notificación y luego accede al NSValueasociado 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)")
}
Ken Anderson
fuente
4
Si bien parece un poco complicado, esto es ciertamente mejor que codificar el tamaño del teclado. Respuesta correcta.
n13
2
Votó esta respuesta y rechazó la pregunta. OP definitivamente no sabe de qué está hablando. ¡Cuidado chicos! ¡Esta respuesta es la correcta!
superarts.org
2
un complemento para Horizontal: if (SYSTEM_VERSION_LESS_THAN (@ "8.0")) {_keyboardHeight = keyboardFrame.size.width; } else {_keyboardHeight = keyboardFrame.size.height; }
LiangWang
3
¿Hay alguna forma de hacer esto sin que aparezca el teclado? En mi caso, quiero tener algo detrás del teclado con la misma altura (similar a cómo los mensajeros tienen cosas)
John
@ superarts.org No hay necesidad de rechazar la pregunta; lo más probable es que la gente busque esto, y ahora verán esta respuesta ... así que todo está bien :)
Ja͢ck
46

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 keyboardWillShowevento de una aplicación .

Esto va a romper un montón de ejemplos de código de legado, que recomendó que escriben un keyboardWillShowevento, 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).

ingrese la descripción de la imagen aquí

En otras palabras, si ve algún código de muestra, que solo le dice que agregue un keyboardWillShowevento, 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 constantvalor de las restricciones verticales .

Practicando AutoLayout

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 keyboardWillShowque 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).

ingrese la descripción de la imagen aquí

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.

Mike Gledhill
fuente
en realidad, el tamaño del teclado siempre varía, incluso en las versiones anteriores de iOS. Por ejemplo, comprobar la escritura a mano en chino
ReDetección
Vaya, no me di cuenta de eso. Me pareció extraño que tantas muestras de "keyboardWillShow" siempre asumieran que este evento solo se llamaría una vez cuando el teclado apareciera o desapareciera ... sin funcionalidad para hacer frente a que el teclado permaneciera en pantalla, pero cambiando su tamaño.
Mike Gledhill
1
@MikeGledhill Creo que deberás usar "UIKeyboardWillChangeFrameNotification" para el cambio de marco debido a la rotación o mostrar (/ ocultar) la barra de predicción de texto ...
Abdalrahman Shatou
Acabo de probar esto con mi aplicación. El UIKeyboardWillChangeFrameNotification siempre se llama ASÍ COMO el evento keyboardWillShow, siempre que hago que aparezca el teclado o enciendo o apago el área de predicción de texto. Así que realmente no ayuda mucho. Mi punto es ... los usuarios deben tener un poco de cuidado con estos eventos, eso es todo.
Mike Gledhill
1
¿Por qué esto no tiene mucha más atención?
rfoo
30

La altura del teclado es de 216 puntos para el modo vertical y 162 puntos para el modo horizontal.

Fuente

Erik B
fuente
135
Si va a publicar preguntas con respuesta propia, al menos proporcione respuestas decentes. El tamaño del teclado debe obtenerse del objeto de notificación, no de un valor codificado tomado de algún sitio web. Ver aquí
jrturton
16
@jrturton La pregunta no es cómo encontrar la altura mediante programación. Esta pregunta no solo es útil para los programadores, sino también para los diseñadores gráficos y demás. La respuesta que está preguntando pertenece a otra pregunta. De hecho, hay otra pregunta con esa respuesta: stackoverflow.com/a/7302291/310121
Erik B
48
@ErikB Ten cuidado. El tamaño del teclado depende del idioma y el tipo de teclado.
Gabriel
13
¡Por su propio bien, NUNCA use el valor codificado! Como un buen ejemplo, un usuario puede estar usando el teclado dividido (de dos partes), que no se preocupa mucho por la altura.
Timo
6
Esta respuesta es perezosa y peligrosa. Obtenga la altura del teclado de UIKeyboardDidShowNotification, ya que el valor real tiende a cambiar entre las principales versiones de iOS. Vea la respuesta de Ken a continuación.
Alexander
16

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:

ingrese la descripción de la imagen aquí

http://www.idev101.com/code/User_Interface/sizes.html

Philipp Sander
fuente
1
nota de la versión : esto ya no tiene valor en iOS 9 y 10, ya que admiten tamaños de teclado personalizados.
Raptor
10

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
           }
    }
torcemente
fuente
8

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!

Seungyoun Yi
fuente
0

iPhone

Tamaños del teclado:

  1. 5S, SE, 5, 5C (320 × 568) keyboardSize = (0.0, 352.0, 320.0, 216.0) keyboardSize = (0.0, 315.0, 320.0, 253.0)

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)

Jr.iOS_dev_T27
fuente