Programaticamente alinhar uma barra de ferramentas na parte superior do teclado do iPhone

StackOverflow https://stackoverflow.com/questions/158574

Pergunta

Em vários casos, eu quero adicionar uma barra de ferramentas para a parte superior do teclado do iPhone (como no iPhone Safari quando você estiver navegando elementos do formulário, por exemplo).

Atualmente estou especificando retângulo da barra de ferramentas com constantes mas porque outros elementos da interface estão em fluxo - barras de ferramentas e barras de navegação no topo da tela - cada vez que fazemos uma mudança de interface menor, a barra de ferramentas sai do alinhamento.

Existe uma maneira de determinar programaticamente a posição do teclado em relação à visão atual?

Foi útil?

Solução

A partir do iOS 3.2, há uma nova maneira de conseguir este efeito:

UITextFields e UITextViews têm uma propriedade inputAccessoryView, que você pode definir a qualquer ponto de vista, que é exibido automaticamente acima e animado com o teclado.

Note que a visão que você usa deve ser nem na hierarquia vista em outros lugares, nem você deve adicioná-lo a algum superview, isso é feito para você.

Outras dicas

Então, basicamente:

No método init:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil];
[nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil];

E, em seguida, têm métodos acima referidos para ajustar a posição da barra:

-(void) keyboardWillShow:(NSNotification *) note
{
    CGRect r  = bar.frame, t;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &t];
    r.origin.y -=  t.size.height;
    bar.frame = r;
}

poderia torná-lo muito animando a mudança de posição por envolvê-lo em

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];

Este é baseado no resposta existente a partir tonklon - Eu estou apenas adicionando um trecho de código que mostra uma barra de ferramentas semi transparente preto na parte superior do teclado, juntamente com um botão "feito" à direita:

UIToolbar *toolbar = [[[UIToolbar alloc] init] autorelease];
[toolbar setBarStyle:UIBarStyleBlackTranslucent];
[toolbar sizeToFit];

UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];

NSArray *itemsArray = [NSArray arrayWithObjects:flexButton, doneButton, nil];

[flexButton release];
[doneButton release];
[toolbar setItems:itemsArray];

[aTextField setInputAccessoryView:toolbar];

e os olhares -resignKeyboard como:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}

Espero que ajude alguém.

Se você se registrar para notificações de teclado, ou seja UIKeyboardWillShowNotification UIKeyboardWillHideNotification, etc, a notificação que receber irá conter os limites do teclado no dict userInfo (UIKeyboardBoundsUserInfoKey).

Veja a referência de classe UIWindow.

Em 3.0 e acima, você pode obter a duração animação e curva do dicionário userInfo das notificações.

Por exemplo, para animar o tamanho da vista para a sala make para o teclado, cadastre-se para o UIKeyboardWillShowNotification e fazer algo como o seguinte:

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

Faça uma animação semelhante para UIKeyboardWillHideNotification.

Eu encontrei este link muito útil para entender passo a passo inputaccesoryview.

entrada de vista acessório

Criar este método e chamá-lo em ViewWillLoad:

        - (void) keyboardToolbarSetup
{
    if(self.keyboardToolbar==nil)
        {
        self.keyboardToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 44)];

        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(anyAction)];

        UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(anyOtherAction)];


        NSArray *toolbarButtons = [[NSArray alloc]initWithObjects:cancelButton,extraSpace,doneButton, nil];

        [self.keyboardToolbar setItems:toolbarButtons];

        self.myTextView.inputAccessoryView=self.keyboardToolbar;
        }
}

Não há nenhuma maneira (AFAIK) para obter as dimensões da vista teclado. No entanto, é constante, pelo menos em cada versão do iPhone até agora.

Se você calcular a posição da barra de ferramentas como um deslocamento da parte inferior do seu ponto de vista e ter o tamanho de seu ponto de vista em conta, então você não deve ter que se preocupar se uma barra de navegação está presente ou não.

por exemplo.

#define KEYBOARD_HEIGHT 240 // example - can't remember the exact size
#define TOOLBAR_HEIGHT 30

toolBarRect.origin.y = viewRect.size.height - KEYBOARD_HEIGHT - TOOLBAR_HEIGHT;

// move toolbar either directly or with an animation

Em vez de uma definição, você pode facilmente criar uma função keyboardHeight que retorna o tamanho com base em se o teclado está sendo exibido, e mover este posicionamento da barra de ferramentas em uma função separada que reorganiza o seu layout.

Também pode depender de onde você fazer isso posicionamento como é possível que o tamanho do seu ponto de vista pode mudar entre ser carregado e mostrado com base na sua configuração de barra de navegação. Eu acredito que o melhor lugar para fazê-lo seria em viewWillAppear.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top