Как переместить текстовое и табличное представление с помощью клавиатуры?

Я разрабатываю приложение для чата в ios, и у меня есть собственное табличное представление и UIView с некоторой кнопкой текстового поля внизу. Я хотел бы переместить UIView и Tableview с помощью клавиатуры, когда текстовое поле активировано. У меня есть этот наблюдатель:

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

а затем метод keyboardWasShown:

- (void)keyboardWasShown:(NSNotification*)aNotification{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
double duration = [number doubleValue];
    [UIView animateWithDuration:duration animations:^{

        CGRect frame = textInputView.frame;
        if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation))
        {
            self.kHeight = kbSize.height;
        }
        else if(UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation))
        {
            self.kHeight = kbSize.width;
        }
        NSLog(@"keyboard up y =%f",self.kHeight);
        frame.origin.y -= self.kHeight;
        textInputView.frame = frame;

        frame = bubbleTable.frame;
        frame.size.height -= self.kHeight;
        bubbleTable.frame = frame;
    }];

Это работает, но вы замечаете, что UIview не перемещается плавно, как в приложении facebook или viber. Поэтому я хотел бы спросить, каков общий подход к этому. Большое тебе спасибо!


person beretis    schedule 16.10.2013    source источник
comment
Вы пытались внедрить свои представления в представление прокрутки и изменить смещение содержимого представления прокрутки вместо рамки представления?   -  person Kamaros    schedule 16.10.2013
comment
Нет, я довольно новичок в Ios, и я не нашел причин для этого, но. Я не уверен, как, но я попробую.   -  person beretis    schedule 16.10.2013


Ответы (3)


Вставьте свои представления в представление прокрутки (если вы используете конструктор интерфейсов, вы можете просто щелкнуть свои представления и выбрать Редактор->Встроить в->Прокрутку в верхнем меню. Вот пример кода:

- (void)keyboardWasShown:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    CGSize kbSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    // Flip kbSize if landscape.
    if (UIInterfaceOrientationIsLandscape([[UIDevice currentDevice] orientation])) {
        kbSize = CGSizeMake(kbSize.height, kbSize.width);
    }

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 1.0);
    [scrollView setContentInset:contentInsets];
    [scrollView setScrollIndicatorInsets:contentInsets];

    CGPoint scrollPoint = CGPointMake(0.0, [bubbleTable frame].origin.y - kbSize.height);
    [scrollView setContentOffset:scrollPoint animated:YES];
}
person Kamaros    schedule 16.10.2013
comment
поэтому я встроил tableview и textEditview в вид прокрутки, но теперь textEditView расположен под видимым экраном, и вам нужно прокручивать его вниз, я не смог исправить это только с ограничениями. Есть ли у вас какие-либо идеи? - person beretis; 17.10.2013
comment
Если это проблема только при отображении клавиатуры, замените [bubbleTable frame] на [textInputView frame]. У меня сложилось впечатление, что представление таблицы было внизу. Если это проблема, когда клавиатура не видна, то ваши ограничения неоднозначны. Прокрутка необходима только тогда, когда contentSize представления прокрутки превышает размер самого представления прокрутки. - person Kamaros; 17.10.2013
comment
Но в Xcode 5, я думаю, есть ошибка, и я не могу правильно установить позиции с ограничениями. Там описана аналогичная проблема: stackoverflow.com/questions/19036228/ - person beretis; 18.10.2013
comment
Вы пробовали команду «Добавить отсутствующие ограничения»? Он доступен с помощью последней кнопки в группе из четырех кнопок, с помощью которых вы обычно устанавливаете ограничения. - person Kamaros; 18.10.2013

Свифт 3

Вы всегда можете переместить любое представление или объект UIKit, имея ссылку на его ограничения (т.е. используя Outlets)

@IBOutlet weak var someViewBottomConstraint: NSLayoutConstraint!

Затем зарегистрируйте уведомление в viewWillLayoutSubviews().

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: .UIKeyboardWillHide, object: nil)
}

Как только вы это сделаете, вам понадобятся 2 метода, которые вы вызываете в viewWillLayoutSubviews().

func keyboardWillShow(_ notification: NSNotification) {
    let keyboardSize: CGSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
    let height = min(keyboardSize.height, keyboardSize.width)
    someViewBottomConstraint.constant = height // you can add a value to the height to move it up/down.
    self.view.layoutIfNeeded() // this will auto animate the view motion with the keyboard

}

func keyboardWillHide() {
    someViewBottomConstraint.constant = 0 
    self.view.layoutIfNeeded()
}
person MEnnabah    schedule 28.03.2017

Попробуйте эту анимацию (поэкспериментируйте с вариантами):

[UIView animateWithDuration:duration
                          delay:0
                        options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         //your animation
                     }
                     completion:nil];
person user2828120    schedule 16.10.2013