Переместите UITableView после того, как появится представление прокрутки с автоматическими значениями завершения - PullRequest
0 голосов
/ 02 мая 2020

Я всегда борюсь с этими проблемами Tableview. На этот раз я специально выбрал UITableViewController, чтобы сама таблица заботилась о перемещениях при появлении клавиатуры. Это прекрасно работает, однако в двух текстовых полях («Отправление» и «Место назначения») я хочу показать под ним небольшой скролл с некоторыми значениями автозаполнения, которые может выбрать пользователь. Таким образом, это представление появляется, как только пользователь вводит некоторые значения. Поэтому моя цель состоит в том, чтобы после того, как клавиатура стала видимой и пользователь что-то ввел, табличное представление перемещается вверх, если необходимо, чтобы текстовое поле И вид прокрутки были видны. Однако у меня есть несколько ошибок, независимо от того, что я пытался. Иногда текстовое поле было скрыто самим прокруткой, иногда оно не двигалось. Где моя ошибка сейчас?

-(void)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string atIndexPath:(NSIndexPath *)indexPath
{
    if(![self.autoCompleteContainerView isDescendantOfView:self.view]){
        //Not yet visible
        FMAddEditField *field = [self fieldForIndexPath:indexPath];
        if([field.planDataField isEqualToString:@"Departure"] || [field.planDataField isEqualToString:@"Destination"]){
            CGRect rectOfCellInTableView = [self.tableView rectForRowAtIndexPath: indexPath];
            CGRect rectOfCellInSuperview = [self.tableView convertRect:rectOfCellInTableView toView:self.tableView.superview];

            self.textFieldWithAutoCompleteManager = textField;


            CGFloat heightOfCellPlusManager = rectOfCellInSuperview.origin.y + rectOfCellInSuperview.size.height + AUTOCOMPLETEVIEW_HEIGHT + AUTOCOMPLETEVIEW_YOFFSETFROMFIELD;
            CGFloat availableScreenSizeMinusKeyboard = self.view.frame.size.height - self.keyboardSize.height;
            //CGRect fieldPlusManager = CGRectMake(0, rectOfCellInTableView.origin.y, self.tableView.frame.size.width, rectOfCellInSuperview.size.height + AUTOCOMPLETEVIEW_HEIGHT + AUTOCOMPLETEVIEW_YOFFSETFROMFIELD);
            NSLog(@"Y of Cell: %f Height of cell: %f", rectOfCellInSuperview.origin.y, rectOfCellInSuperview.size.height);

            //if(heightOfCellPlusManager > availableScreenSizeMinusKeyboard){
            //Move
            CGFloat moveOffset = heightOfCellPlusManager - availableScreenSizeMinusKeyboard;
            NSLog(@"Content offset now: %f", self.tableView.contentOffset.y);
            [UIView animateWithDuration:0.3 animations:^{
                [self.tableView setContentOffset:CGPointMake(0, moveOffset) animated:NO];
            } completion:^(BOOL finished){
                if(finished){
                    [self drawAutoCompleteManagerToFrame:rectOfCellInSuperview];
                }
            }];

            NSLog(@"Content offset after: %f", self.tableView.contentOffset.y);

        }
    }

    if([self.autoCompleteContainerView isDescendantOfView:self.view]){
        NSString *searchedString = [textField.text stringByReplacingCharactersInRange:range withString:string];
        [self.autoCompleteManager processString:searchedString];
    }
}
...