Подтвердить что ты не робот

Клавиатура iMessage Receding в приложении iOS

Мне было интересно, возможно ли повторить поведение клавиатуры Apple iOS5 в приложении сообщений без использования каких-либо частных вызовов API. Когда вы прокручиваете вниз клавиатуру в приложении сообщений, клавиатура рухнет, оставив больше места для просмотра сообщений - попробуйте посмотреть.

Я не мог найти ничего, что указывало бы на это, без необходимости перескакивать через некоторые серьезные обручи, чтобы получить экземпляр Keyboard View. И я уверен, что Apple не понравится этому.

В дополнение к приведенному ниже ответу вы можете увидеть полностью исполняемый проект xcode моей реализации здесь: https://github.com/orta/iMessage-Style-Receding-Keyboard

4b9b3361

Ответ 1

Это неполное решение, однако оно должно дать вам хорошую отправную точку.

Добавьте в свой UIViewController следующие ivars:

CGRect        keyboardSuperFrame; // frame of keyboard when initially displayed
UIView      * keyboardSuperView;  // reference to keyboard view

Добавить inputAccessoryView в текстовый контроллер. Я создал небольшой вид для вставки в качестве аксессуара:

accView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
accView.backgroundColor = [UIColor clearColor];
textField.inputAccessoryView = accView;

Я добавил код выше -(void)loadView

Зарегистрируйтесь, чтобы получать UIKeyboardDidShowNotification и UIKeyboardDidHideNotification при загрузке представления:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(keyboardWillShow:)
        name:UIKeyboardWillShowNotification
        object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(keyboardDidShow:)
        name:UIKeyboardDidShowNotification
        object:nil];
    return;
}

Добавить методы, указанные в качестве селекторов для уведомлений:

// method is called whenever the keyboard is about to be displayed
- (void)keyboardWillShow:(NSNotification *)notification
{
    // makes keyboard view visible incase it was hidden
    keyboardSuperView.hidden = NO;
    return;
}
// method is called whenever the keyboard is displayed
- (void) keyboardDidShow:(NSNotification *)note
{
    // save reference to keyboard so we can easily determine
    // if it is currently displayed
    keyboardSuperView  = textField.inputAccessoryView.superview;

    // save current frame of keyboard so we can reference the original position later
    keyboardSuperFrame = textField.inputAccessoryView.superview.frame;
    return;
}

Добавить методы для отслеживания касания и обновления вида клавиатуры:

// stops tracking touches to divider
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGRect newFrame;
    CGRect bounds = [[UIScreen mainScreen] bounds];

    newFrame = keyboardSuperFrame;
    newFrame.origin.y = bounds.size.height;  

    if ((keyboardSuperView.superview))
        if (keyboardSuperFrame.origin.y != keyboardSuperView.frame.origin.y)
            [UIView animateWithDuration:0.2
                    animations:^{keyboardSuperView.frame = newFrame;}
                    completion:^(BOOL finished){
                                keyboardSuperView.hidden = YES;
                                keyboardSuperView.frame = keyboardSuperFrame;
                                [textField resignFirstResponder]; }];
    return;
}


// updates divider view position based upon movement of touches
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
   UITouch  * touch;
   CGPoint    point;
   CGFloat    updateY;

   if ((touch = [touches anyObject]))
   {
      point   = [touch locationInView:self.view];
      if ((keyboardSuperView.superview))
      {
         updateY = keyboardSuperView.frame.origin.y;
         if (point.y < keyboardSuperFrame.origin.y)
            return;
         if ((point.y > updateY) || (point.y < updateY))
            updateY = point.y;
         if (keyboardSuperView.frame.origin.y != updateY)
            keyboardSuperView.frame = CGRectMake(keyboardSuperFrame.origin.x,
                                                 point.y,
                                                 keyboardSuperFrame.size.width,
                                                 keyboardSuperFrame.size.height);
      };
   };
   return;
}

Отказ от ответственности:

  • При отставке, как сначала ответили, клавиатура вернется в исходное положение, прежде чем сдвинуться с экрана. Чтобы убрать клавиатуру больше жидкости, сначала нужно создать анимацию, чтобы вывести клавиатуру с экрана, а затем скрыть представление. Я оставлю эту часть в качестве упражнения для читателей.
  • Я тестировал это только на симуляторе iOS 5 и iPhone с iOS 5. Я не тестировал это с более ранними версиями iOS.

Проект SlidingKeyboard, который я создал для тестирования этой концепции, доступен в GitHub в каталоге примеров BindleKit:

https://github.com/bindle/BindleKit

Изменить: пример обновления для первого отказа от ответственности.

Ответ 2

В iOS 7 в UIScrollView есть свойство keyboardDismissMode. Поэтому просто установите его в "UIScrollViewKeyboardDismissModeInteractive", и вы получите это поведение. Работает в подклассах UIScrollView, таких как UITableView.

self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Swift 3:

tableView.keyboardDismissMode = .interactive

Или измените его в раскадровке (при ее использовании) в инспекторе атрибутов для вашего подкласса UIScrollView.

Ответ 3

Владимир простое решение скроет клавиатуру по мере прокрутки пользователя. Однако, чтобы закончить вопрос относительно iMessage, чтобы TextField всегда отображался и привязывался к вершине клавиатуры, вам необходимо реализовать следующие методы:

- (UIView *) inputAccessoryView {
     // Return your textfield, buttons, etc
}

- (BOOL) canBecomeFirstResponder {
    return YES;
}

Вот хороший учебник, разбивающий его больше