Allinea a livello di codice una barra degli strumenti sulla parte superiore della tastiera dell'iPhone

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

Domanda

In diversi casi voglio aggiungere una barra degli strumenti nella parte superiore della tastiera dell'iPhone (come in iPhone Safari durante la navigazione di elementi del modulo, ad esempio).

Attualmente sto specificando il rettangolo della barra degli strumenti con le costanti, ma poiché altri elementi dell'interfaccia sono in flusso - barre degli strumenti e barre di navigazione nella parte superiore dello schermo - ogni volta che facciamo una piccola modifica dell'interfaccia, la barra degli strumenti non è allineata.

Esiste un modo per determinare a livello di programmazione la posizione della tastiera rispetto alla vista corrente?

È stato utile?

Soluzione

A partire da iOS 3.2 c'è un nuovo modo per ottenere questo effetto:

UITextFields e UITextViews hanno una proprietà inputAccessoryView , che puoi impostare su qualsiasi vista, che viene automaticamente visualizzata sopra e animata con la tastiera .

Nota che la vista che usi non dovrebbe essere nella gerarchia della vista altrove, né dovresti aggiungerla a qualche superview, questo è fatto per te.

Altri suggerimenti

Quindi sostanzialmente:

Nel metodo 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 quindi hanno i metodi di cui sopra per regolare la posizione della 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;
}

Potrebbe renderlo carino animando il cambio di posizione avvolgendolo in

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

Questo si basa sul risposta esistente da tonklon - Sto solo aggiungendo uno snippet di codice che mostra una barra degli strumenti nera semitrasparente sulla parte superiore della tastiera, insieme a un messaggio "fatto" pulsante a destra:

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 il -resignKeyboard appare come:

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

Spero che aiuti qualcuno.

Se ti registri per le notifiche della tastiera, ad es. UIKeyboardWillShowNotification UIKeyboardWillHideNotification , ecc., la notifica che riceverai conterrà i limiti della tastiera in userInfo dict ( UIKeyboardBoundsUserInfoKey ).

Vedi il riferimento di classe UIWindow .

In 3.0 e versioni successive puoi ottenere la durata e la curva dell'animazione dal dizionario userInfo delle notifiche.

ad esempio, per animare le dimensioni della vista per fare spazio alla tastiera, registrati per UIKeyboardWillShowNotification e fai qualcosa del tipo:

- (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];
}

Esegui un'animazione simile per UIKeyboardWillHideNotification .

Ho trovato questo link molto utile per capire inputaccesoryview passo dopo passo.

vista accessori di input

Crea questo metodo e chiamalo su 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;
        }
}

Non c'è modo (AFAIK) per ottenere le dimensioni della vista della tastiera. È comunque costante, almeno in tutte le versioni di iPhone finora.

Se si calcola la posizione della barra degli strumenti come offset dalla parte inferiore della vista e si tiene conto della dimensione della vista, non dovresti preoccuparti se è presente una barra di navigazione.

per es.

#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

Invece di definire, potresti facilmente creare una funzione keyboardHeight che restituisce le dimensioni in base alla visualizzazione della tastiera e spostare il posizionamento di questa barra degli strumenti in una funzione separata che riorganizza il layout.

/ p>

Inoltre, può dipendere da dove viene effettuato questo posizionamento, poiché è possibile che le dimensioni della vista cambino tra il caricamento e la visualizzazione in base alla configurazione della barra di navigazione. Credo che il posto migliore per farlo sarebbe in viewWillAppear.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top