Alcune osservazioni:
Il modello consigliato per un oggetto singleton sarebbe il seguente. dispatch_once si assicura che la classe venga inizializzata una volta in modo thread-safe e che la variabile statica non sia visibile all'esterno. Ed è GCD standard, quindi non è necessario conoscere i dettagli di basso livello di Objective-C.
+ (KeyboardStateListener *)sharedInstance
{
static KeyboardStateListener* shared;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[KeyboardStateListener alloc] init];
// Other initialisations
});
return shared;
}
Di solito non vuoi sapere solo se la tastiera è visibile o meno, ma quanto è grande. Le tastiere non hanno tutte le stesse dimensioni. Le tastiere dell'iPhone sono più piccole delle tastiere dell'iPad. Quindi vorresti un'altra proprietà @property (readonly, nonatomic) CGRect keyboardRect;
che è impostata nel metodo noticeShowKeyboard: come questo:
NSValue* value = notification.userInfo [UIKeyboardFrameEndUserInfoKey];
_keyboardRect = value.CGRectValue;
È importante notare che il rettangolo è nelle coordinate di UIWindow e non rispetta la rotazione dello schermo. Quindi il chiamante convertirà quel rettangolo chiamando
KeyboardStateListener* listener = [KeyboardStateListener sharedInstance];
CGRect windowRect = listener.keyboardRect;
CGRect viewRect = [myView convertRect:windowRect fromView:self.window];
Se l'utente ruota lo schermo mentre la tastiera è visibile, all'app verrà detto che la tastiera è nascosta, quindi mostrata di nuovo. Quando viene visualizzato, è molto probabile che altre visualizzazioni non siano ancora ruotate. Quindi, se osservi tu stesso gli eventi nascosti / mostrati dalla tastiera, converti le coordinate quando ne hai effettivamente bisogno, non nella notifica.
Se l'utente divide o sgancia la tastiera o utilizza una tastiera hardware, le notifiche mostreranno sempre la tastiera come nascosta. Lo scollegamento o l'unione della tastiera invierà una notifica "Tastiera visualizzata".
L'ascoltatore deve essere inizializzato mentre la tastiera è nascosta, altrimenti la prima notifica verrà persa e si presume che la tastiera sia nascosta quando non lo è.
Quindi è molto importante sapere cosa vuoi veramente. Questo codice è utile per spostare le cose dalla tastiera (con una tastiera divisa o sganciata, questa è la responsabilità dell'utente). Non ti dice se l'utente può vedere una tastiera sullo schermo (nel caso di una tastiera divisa). Non ti dice se l'utente può digitare (ad esempio quando è presente una tastiera hardware). Guardare altre finestre non funziona se l'app crea altre finestre.