L'altezza in verticale e l'altezza in orizzontale misurata in punti.
L'altezza in verticale e l'altezza in orizzontale misurata in punti.
Risposte:
Ho utilizzato il seguente approccio per determinare la cornice della tastiera in iOS 7.1.
Nel metodo init del mio controller di visualizzazione, mi sono registrato per UIKeyboardDidShowNotification
:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Quindi, ho utilizzato il seguente codice keyboardOnScreen:
per accedere alla cornice della tastiera. Questo codice ottiene il userInfo
dizionario dalla notifica e quindi accede al file NSValue
associato UIKeyboardFrameEndUserInfoKey
. È quindi possibile accedere a CGRect e convertirlo nelle coordinate della vista del controller della vista. Da lì, puoi eseguire tutti i calcoli necessari in base a quel frame.
-(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));
}
Swift
E l'implementazione 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)")
}
Ricorda che, con iOS 8, le dimensioni della tastiera su schermo possono variare. Non dare per scontato che la tastiera su schermo sarà sempre visibile (con un'altezza specifica ) o invisibile.
Ora, con iOS 8, l'utente può anche scorrere l'area di previsione del testo per attivare e disattivare ... e quando lo fa, si avvia di nuovo l'keyboardWillShow
evento di un'app .
Questo sarà rompere un sacco di esempi di codice legacy, che ha raccomandato la scrittura di un keyboardWillShow
evento, che si limita misura l'altezza attuale della tastiera su schermo, e spostando i controlli verso l'alto o verso il basso sulla pagina di questa quantità (assoluto).
In altre parole, se vedi un codice di esempio, che ti dice semplicemente di aggiungere un keyboardWillShow
evento, misurare l'altezza della tastiera, quindi ridimensionare l'altezza dei controlli di questo importo, questo non funzionerà più.
Nel mio esempio sopra, ho usato il codice di esempio dal seguente sito, che anima il constant
valore dei vincoli verticali .
Praticare il layout automatico
Nella mia app, ho aggiunto un vincolo al mio UITextView
, impostato nella parte inferiore dello schermo. Quando lo schermo è apparso per la prima volta, ho memorizzato questa distanza verticale iniziale.
Quindi, ogni volta che il mio keyboardWillShow
evento viene avviato, aggiungo la (nuova) altezza della tastiera a questo valore del vincolo originale (quindi il vincolo ridimensiona l'altezza del controllo).
Si. È brutto.
E sono un po 'infastidito / sorpreso dal fatto che l'orribile e doloroso AutoLayout di XCode 6 non ci consente solo di collegare la parte inferiore dei controlli alla parte inferiore dello schermo o alla parte superiore della tastiera su schermo.
Forse mi manca qualcosa.
Oltre alla mia sanità mentale.
L'altezza della tastiera è 216 punti per la modalità verticale e 162 punti per la modalità orizzontale.
nota sulla versione: questo non è più un valore in iOS 9 e 10, poiché supportano le dimensioni della tastiera personalizzate.
Dipende dal modello e dalla barra QuickType:
L'altezza della tastiera dipende dal modello, dalla barra QuickType, dalle impostazioni dell'utente ... L'approccio migliore è calcolare dinamicamente:
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
}
}
Non riesco a trovare l'ultima risposta, quindi controllo tutto con il simulatore. (IOS 11.0)
Dispositivo | Altezza dello schermo | Ritratto | Paesaggio
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 di quinta generazione, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024.0 | 265.0 | 353.0
Grazie!
i phone
Dimensioni della tastiera:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.
3,6 +, 6S +, 7+, 8+: tastiera (414 × 736) Dimensioni = (0,0, 465,0, 414,0, 271,0)
4.XS, X: (375 X 812) dimensione della tastiera = (0,0, 477,0, 375,0, 335,0)
5.XR, XSMAX ((414 x 896) dimensioni della tastiera = (0,0, 550,0, 414,0, 346,0)