Я всегда борюсь с этими проблемами 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];
}
}