Programowo wyrównuj pasek narzędzi na klawiaturze iPhone ' a

W kilku przypadkach chcę dodać pasek narzędzi na górze klawiatury iPhone ' a(jak w iPhone Safari, gdy poruszasz się po elementach formularza, na przykład).

Obecnie określam prostokąt paska narzędzi stałymi, ale ponieważ inne elementy interfejsu są w strumieniu-paski narzędzi i paski nav u góry ekranu - za każdym razem, gdy dokonujemy drobnej zmiany interfejsu, pasek narzędzi nie jest wyrównany.

Czy jest sposób na programowe określenie pozycji klawiatura w stosunku do bieżącego widoku?

Author: Jacob Relkin, 2008-10-01

8 answers

[[3]} od wersji iOS 3.2 istnieje nowy sposób na osiągnięcie tego efektu:

UITextFields i UITextViews mają właściwość inputAccessoryView, którą można ustawić na dowolny widok, który jest automatycznie wyświetlany powyżej i animowany za pomocą klawiatury.

Zauważ, że widok, którego używasz, nie powinien znajdować się w hierarchii widoków gdzie indziej, ani nie powinien być dodawany do jakiegoś superview, jest to zrobione za Ciebie.

 142
Author: tonklon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 21:16:29

Więc zasadniczo:

W metodzie 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];

A następnie mają metody, o których mowa powyżej, aby dostosować położenie paska:

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

Może sprawić, że będzie ładny, animując zmianę pozycji, owijając ją w

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
//...
    [UIView commitAnimations];
 72
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-28 05:37:28

Jest to oparte na istniejącej odpowiedzi z tonklon - dodaję tylko fragment kodu, który pokazuje półprzezroczysty czarny pasek narzędzi na górze klawiatury, wraz z przyciskiem "Gotowe" po prawej stronie:

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

A -resignKeyboard wygląda tak:

-(void)resignKeyboard {
  [aTextField resignFirstResponder];
}
Mam nadzieję, że to komuś pomoże.
 60
Author: phi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:33:47

Jeśli rejestrujesz się na powiadomienia z klawiatury, ie UIKeyboardWillShowNotification UIKeyboardWillHideNotification, itd., powiadomienie, które otrzymasz, będzie zawierało granice klawiatury w userInfo dict (UIKeyboardBoundsUserInfoKey).

Zobacz numer Klasy UIWindow.

 24
Author: amrox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 19:31:36

W wersji 3.0 i nowszej można uzyskać czas trwania animacji i krzywą ze słownika userInfo powiadomień.

Na przykład, aby animować rozmiar widoku, aby zrobić miejsce dla Klawiatury, Zarejestruj się dla UIKeyboardWillShowNotification i zrób coś takiego:

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

Wykonaj podobną animację dla UIKeyboardWillHideNotification.

 16
Author: David Beck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 21:17:19

Znalazłem ten link bardzo przydatny do zrozumienia inputaccesoryview krok po kroku.

Input accessory view

 3
Author: Julian Osorio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 13:19:36

Utwórz tę metodę i wywołaj ją przy 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;
        }
}
 0
Author: Juan Sebastián López,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 16:33:47

Nie ma możliwości (AFAIK), aby uzyskać wymiary widoku klawiatury. Jest to jednak stałe, przynajmniej w każdej wersji iPhone do tej pory.

Jeśli obliczysz pozycję paska narzędzi jako przesunięcie od dołu widoku i weźmiesz pod uwagę rozmiar widoku, nie musisz się martwić, czy pasek nawigacyjny jest obecny, czy nie.

Np.

#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

Zamiast define, możesz łatwo utworzyć keyboardHeight funkcję, która zwraca rozmiar w zależności od tego, czy klawiatura jest wyświetlanie, i przenieść to pozycjonowanie paska narzędzi do osobnej funkcji, która reorganizuje układ.

Może również zależeć od tego, gdzie robisz to pozycjonowanie, ponieważ jest możliwe, że rozmiar widoku może się zmieniać między załadowaniem a wyświetlaniem na podstawie konfiguracji paska nawigacyjnego. Uważam, że najlepszym miejscem do zrobienia tego będzie viewWillAppear.

 -4
Author: Andrew Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-20 12:25:51