iphone move - Обложки iPhone для iPhone UITextField




10 Answers

Обычное решение заключается в том, чтобы сместить поле (и все выше него) с анимацией, а затем отступить, когда вы закончите. Возможно, вам нужно будет поместить текстовое поле и некоторые другие элементы в другое представление и сдвинуть представление как единое целое. (Я называю эти вещи «тарелки», как в «тектонических пластинах», но это только я). Но вот общая идея, если вам не нужно проявлять фантазию.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [self animateTextField: textField up: YES];
}


- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [self animateTextField: textField up: NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];
}
view up

У меня есть приложение, где в интерфейсе Builder я настроил UIView , у которого есть текстовое поле в нижней части представления. Когда я запускаю приложение и пытаюсь ввести текст в это поле, клавиатура сдвигает верхнюю часть поля, поэтому я не вижу, что я набираю, пока не скрою клавиатуру.

Кто-нибудь еще столкнулся с этой проблемой и нашел хороший способ ее решить, не заставляя родительское представление прокручиваться или перемещать текстовое поле дальше экрана?




IQKeyboardManager делает это для вас без NO LINE OF CODE , нужно только перетащить связанный исходный файл для проекта. IQKeyboardManager также поддерживает ориентацию устройств , автоматическое управление UIToolbar , keyboardDistanceFromTextField и многое другое, чем вы думаете.

Вот диаграмма потока управления:

Шаг 1: - Добавлены глобальные уведомления UITextField , UITextView и UIKeyboard в одноэлементном классе. Я назвал его IQKeyboardManager .

Шаг 2: - Если найдено UIKeyboardWillShowNotification , UITextFieldTextDidBeginEditingNotification или UITextViewTextDidBeginEditingNotification уведомления, попробуйте получить экземпляр topMostViewController из иерархии UIWindow.rootViewController . Чтобы правильно UITextField / UITextView на нем, необходимо скорректировать рамку topMostViewController.view .

Шаг 3: - Рассчитанное ожидаемое расстояние перемещения topMostViewController.view относительно первого UITextField / UITextView .

Шаг4: - Переместил topMostViewController.view.frame вверх / вниз в соответствии с ожидаемым расстоянием перемещения.

Шаг 5: - Если найдено UIKeyboardWillHideNotification , UITextFieldTextDidEndEditingNotification или UITextViewTextDidEndEditingNotification , затем попробуйте получить экземпляр topMostViewController из иерархии UIWindow.rootViewController .

Шаг 6: - Рассчитанное нарушенное расстояние topMostViewController.view которое необходимо восстановить в исходное положение.

Шаг7: - Восстановлено topMostViewController.view.frame вниз в соответствии с нарушенным расстоянием.

Шаг 8: - IQKeyboardManager экземпляр экземпляра Singleton IQKeyboardManager при загрузке приложения, поэтому каждый UITextField / UITextView в приложении будет автоматически настраиваться в соответствии с ожидаемым расстоянием перемещения.

Это все




Как насчет официального решения: перемещение контента, находящегося под клавиатурой

Настройка содержимого обычно включает временное изменение размера одного или нескольких видов и их размещение так, чтобы текстовый объект оставался видимым. Самый простой способ управлять текстовыми объектами с помощью клавиатуры - встраивать их в объект UIScrollView (или один из его подклассов, например UITableView). Когда клавиатура отображается, все, что вам нужно сделать, это сбросить содержимое области прокрутки и прокрутить нужный текстовый объект в нужное положение. Таким образом, в ответ на UIKeyboardDidShowNotification, ваш метод обработчика будет делать следующее:

  1. Получите размер клавиатуры.
  2. Отрегулируйте нижнюю вставку содержимого вашего вида прокрутки по высоте клавиатуры.
  3. Прокрутите целевое текстовое поле в представлении.
// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];

   [[NSNotificationCenter defaultCenter] addObserver:self
             selector:@selector(keyboardWillBeHidden:)
             name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your app might not need or want this behavior.
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        [self.scrollView scrollRectToVisible:activeField.frame animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}



Проверь это. Никаких хлопот для вас.

Это решение очень аккуратно. Все, что вам нужно сделать, это добавить ваши TPKeyboardAvoidingScollView в UIScrollView и изменить его класс на TPKeyboardAvoidingScollView , если вы используете раскадровки. Вид прокрутки расширяется таким образом, что он будет обнаруживать, когда клавиатура видна и будет двигаться над клавиатурой на разумном расстоянии. Это идеальное решение, потому что оно не зависит от вашего UIViewController . Все необходимые вещи выполняются в рамках вышеупомянутого класса. Спасибо Майкл Тайсон и все.

TPKeyboardAvoiding




Было замечательное пошаговое руководство по редактированию текстовых полей без затенения (теперь ссылка мертва, вот ссылка Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/11/editing-textfields-without-obscuring.html ). Он показывает, как переместить существующий UIView на UIScrollView и автоматически прокручивать его при появлении клавиатуры.

Я немного обновил его, чтобы вычислить правильную высоту для UIScrollView когда есть элементы управления (например, UITabBar ) под UIScrollBar . См. Обновление сообщений uiview .




Я предполагаю, что одним из способов было бы перемещение позиции вашего взгляда из (x, y) в (x, y-keybaardHeight), когда текстовое поле будет нажато и вернулось назад, когда клавиатура будет уволена, может показаться немного странным, поскольку представление просто (возможно, это было бы плохо, если бы вы его оживили).

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame=self.view.frame;
    frame.origin=CGPointMake(x...//set point here
    self.view.frame=frame;
}



У меня была та же проблема, и я нашел GTKeyboardHelper простым выходом.

После перетаскивания рамки в вашем проекте включите заголовочный файл. Загрузите и откройте пример проекта, затем перетащите объект «Помощник клавиатуры» из раздела объектов в xib в раздел объектов в построителе интерфейса вашего проекта.

Перетащите все свои взгляды, чтобы быть детьми «Помощника клавиатуры».




Перетащите фреймворк, который я использую в своих проектах. Поддерживает автоматическое увольнение при нажатии вне первого ответчика или при прокрутке.

GTKeyboardHelper




Просто сдвиньте вид вверх и вниз по мере необходимости:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    self.currentTextField = nil;
    [self animateTextField: textField up: NO];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [self.currentTextField resignFirstResponder];
    return YES;
}

- (void) animateTextField:(UITextField*) textField up:(BOOL)up {
    const int movementDistance = 80; // tweak as needed
    const float movementDuration = 0.3f; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView animateWithDuration:movementDuration animations:^{
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }];
}

Не забудьте указать self как UITextFieldDelegate и как фактический delegate textField.

(Спасибо Ammagrammer, это всего лишь короткий ответ, используя блоки для анимации)




Я верю в более новые версии iOS (6.1+, возможно, даже раньше), основной вид, по крайней мере для UITableView, автоматически сжимается, когда клавиатура появляется. Поэтому вам нужно только сделать текстовое поле видимым в этом представлении. В init :

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification
                                           object:nil];

тогда:

- (void)keyboardWasShown:(NSNotification*)notification
{
    // Scroll the text field into view so it's not under the keyboard.
    CGRect rect = [self.tableView convertRect:inputView.bounds fromView:inputView];
    [self.tableView scrollRectToVisible:rect animated:YES];
}



Related

iphone keyboard uitextfield