IOS / Swift: определить вертикальное положение последнего заполненного ряда таблицы - PullRequest
0 голосов
/ 01 октября 2018

У меня есть вид таблицы на экране, где клавиатура появляется и исчезает.Если рядом с основанием есть ряды, которые должна покрывать клавиатура, я бы хотел, чтобы представление таблицы двигалось вверх настолько, чтобы строки были видны.

Прямо сейчас я могу заставить весь просмотр таблицы двигаться вверх, когдаклавиатура появляется.Это работает, потому что представление таблицы ограничено сверху и снизу вплоть до полей.

Однако, если сверху всего несколько строк, когда появляется клавиатура и поднимает представление таблицы вверх, эти строкибольше не видныПоэтому я думаю, что мне нужно сместить движение табличного представления на расстояние между нижней строкой и нижней частью табличного представления.

Я могу получить высоту клавиатуры, используя следующий код:

 var heightKeyboard : CGFloat?
    func keyboardShown(notification: NSNotification) {
        if let infoKey  = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
            let rawFrame = (infoKey as AnyObject).cgRectValue {
            let keyboardFrame = view.convert(rawFrame, from: nil)
            self.heightKeyboard = keyboardFrame.size.height
            // Now is stored in your heightKeyboard variable
        }
    }

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

Заранее благодарен за любые предложения о том, как это сделать.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я думаю, что это поможет вам.

  1. Вызовите addKeyboardObserver() метод из вашего viewWillAppear(_ animated: Bool) метода.
  2. Вызовите NotificationCenter.removeObserver(self) метод из вашего viewWillDisappear(_ animated: Bool).

`

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

@objc func keyboardWillShow(_ notification: NSNotification){
    if let userInfo = notification.userInfo {
        if let keyboardSize = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect {
            guard let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double else {return}
            tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height + padding, 0)
        }
    }
}

@objc func keyboardWillHide(_ notification: NSNotification){
    guard let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double else {return}
    tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
0 голосов
/ 01 октября 2018

Было бы лучше изменить свойство `contentInset 'вместо высоты вашего tableView.

- (void)keyboardWillShow:(NSNotification *)note {
    CGRect rect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat height = rect.size.height;

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, height, 0);
    NSInteger lastSection = [self numberOfSectionsInTableView:self.tableView] - 1;
    NSInteger lastRow = [self.tableView numberOfRowsInSection:lastSection] - 1;
    NSIndexPath *lastRowIndexPath = [NSIndexPath indexPathForRow:lastRow inSection:lastSection];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[note.userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue]];
    [UIView setAnimationBeginsFromCurrentState:YES];

    [self.tableView scrollToRowAtIndexPath:lastRowIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

    [UIView commitAnimations];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...