2014-06-30 2 views
0

J'essaie de créer une interface utilisateur permettant aux utilisateurs de basculer entre le clavier et les autres menus lors de l'utilisation d'une application de discussion.Comment assigner un pointeur au clavier avant d'avoir affecté le premier répondeur?

Sur un clic de la barre textField, je souhaite lever le clavier ou une vue de collection.

Le problème se produit lorsque je clique sur le bouton 'menu'. Je veux que la barre textField augmente pour révéler ma vue de menu. Puis, en un clic sur le bouton du clavier, passez instantanément au clavier, plutôt que de le faire glisser par le bas. Cela signifie que je dois avoir le clavier déjà chargé et caché, mais en arrière-plan de l'application.

Actuellement, la fonction keyboardDidShow est la plus ancienne que j'arrive à assigner une variable au clavier.

-(void) keyboardDidShow: (NSNotification *) notification { 

    // Get the window the keyboard is a subview of 
    _window = [UIApplication sharedApplication].windows.lastObject; 

    _keyboard = _window.subviews[0]; 
} 

Cela signifie qu'après qu'il a été chargé une fois que je peux me cacher et de révéler, mais je ne veux pas visible quand il se charge de cette première fois.

Pour y parvenir, je l'ai alternatif en utilisant des moyens essayé d'ajouter mon point de vue supplémentaires comme subviews du UIWindow le clavier est créé dans:

[_window addSubview:_menuView]; 
[_window addSubview:_gamesView]; 
[_window addSubview:_stickerView]; 

[self hideSpecificView]; 

Malheureusement, je continue à venir à travers le même problème, jusqu'à ce que je l'ai chargé le clavier une fois qu'il doit charger complètement avant que je puisse obtenir un pointeur pour le cacher.

Voici une photo de mon toolBar Incase Je ne suis pas clair:

enter image description here

En cliquant sur l'icône de menu ou l'icône autocollants Je veux la barre pour soulever en vue de la collecte. Si je clique alors sur le champ de texte, avec ces vues visibles, je veux cacher la vue visible pour montrer immédiatement le clavier derrière.

J'ai également essayé d'expérimenter avec keyboardWillShow mais comme la fenêtre n'a pas été chargée devant notre écran je ne peux pas obtenir un pointeur sur le clavier pour le cacher avant qu'il ne se charge.

Un exemple de ce que je suis après peut être trouvé de nombreuses applications de chat (facebook messenger, LINE, kakaotalk)

Toute aide serait grandement appréciée

Répondre

0

Bien que la façon dont je suis venu avec ne parfait cela fonctionne presque parfaitement, donc j'espère que cela pourrait aider les gens dans le futur. Si quelqu'un d'autre l'a résolu différemment s'il vous plaît poster, car il serait intéressant de savoir comment vous l'avez fait.

J'ai commencé par ajouter une variable de classe à une UIWindow dans mon fichier d'en-tête, puis à déclencher une temporisation pour pinger juste après que le clavier affiche la fin de la méthode. Après que cette méthode a fini, le clavier a été créé, juste, et donc je l'alloue et le cache.

-(void) keyboardWillShow: (NSNotification *) notification { 

    // More keyboard code 

    _window = [UIApplication sharedApplication].windows.lastObject; 

    [NSTimer scheduledTimerWithTimeInterval:0.01 
            target:self 
            selector:@selector(allocateKeyboard) 
            userInfo:nil 
            repeats:NO]; 
} 

- (void)allocateKeyboard { 

    if (!_keyboard) { 
     _keyboard = _window.subviews[0]; 
    } 

    _keyboard.hidden = YES; 

    [self setViewForButtonType]; 
} 

Je l'ai déjà ajouté précédemment mes autres vues, les cachés et les contraintes au fond de l'écran principal, cela signifie que lorsque le clavier se lève, ils le font aussi.

- (void)viewDidLoad { 

[self.view addSubview:_menuView]; 
[self.view addSubview:_gamesView]; 
[self.view addSubview:_stickerView]; 

} 

... 

- (void)hideViews { 

    _keyboard.hidden = YES; 
    _menuView.hidden = YES; 
    _gamesView.hidden = YES; 
    _stickerView.hidden = YES; 
} 

Lorsque je boutons obtenir pressé simples unhide alors la vue que je veux voir et cacher le reste des points de vue.Quand je dis que cette méthode ne fonctionne pas parfaitement, c'est parce que si vous chargez la vue principale, puis cliquez sur un bouton avant que le clavier ne soit chargé pour la première fois, vous obtenez un aperçu rapide du clavier avant la vue apparaît sur le dessus. Cela ne se produit que la première fois et seulement s'ils ne cliquent pas dans le champ de texte en premier.

Quoi qu'il en soit, j'ai trouvé que c'était la meilleure façon de faire en sorte que les vues semblent être devant le clavier. Évidemment, mon code était beaucoup plus long et plus complexe (trop long pour ici) mais c'est l'essentiel de la méthode que j'ai utilisée pour le résoudre. Commentez si vous avez des questions et j'espère que cela vous aidera.

Questions connexes