Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get UITableView to scroll to the selected UITextField and Avoid Being Hidden by Keyboard

I have a UITextField in a table view on a UIViewController (not a UITableViewController). If the table view is on a UITableViewController, the table will automatically scroll to the textField being edited to prevent it from being hidden by the keyboard. But on a UIViewController it does not.

I have tried for a couple of days reading through multiple ways to try to accomplish this and I cannot get it to work. The closest thing that actually scrolls is:

-(void) textFieldDidBeginEditing:(UITextField *)textField {  // SUPPOSEDLY Scroll to the current text field  CGRect textFieldRect = [textField frame]; [self.wordsTableView scrollRectToVisible:textFieldRect animated:YES];  } 

However this only scrolls the table to the topmost row. What seems like an easy task has been a couple of days of frustration.

I am using the following to construct the tableView cells:

- (UITableViewCell *)tableView:(UITableView *)aTableView     cellForRowAtIndexPath:(NSIndexPath *)indexPath {  NSString *identifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition: 0], [indexPath indexAtPosition:1]];  UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:identifier];      if (cell == nil) {          cell = [[[UITableViewCell alloc]          initWithStyle:UITableViewCellStyleDefault          reuseIdentifier:identifier] autorelease];          cell.accessoryType = UITableViewCellAccessoryNone;          UITextField *theTextField = [[UITextField alloc] initWithFrame:CGRectMake(180, 10, 130, 25)];          theTextField.adjustsFontSizeToFitWidth = YES;         theTextField.textColor = [UIColor redColor];         theTextField.text = [textFieldArray objectAtIndex:indexPath.row];         theTextField.keyboardType = UIKeyboardTypeDefault;         theTextField.returnKeyType = UIReturnKeyDone;         theTextField.font = [UIFont boldSystemFontOfSize:14];         theTextField.backgroundColor = [UIColor whiteColor];         theTextField.autocorrectionType = UITextAutocorrectionTypeNo;         theTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;         theTextField.clearsOnBeginEditing = NO;         theTextField.textAlignment = UITextAlignmentLeft;          //theTextField.tag = 0;         theTextField.tag=indexPath.row;          theTextField.delegate = self;          theTextField.clearButtonMode = UITextFieldViewModeWhileEditing;         [theTextField setEnabled: YES];          [cell addSubview:theTextField];          [theTextField release];   }  return cell; } 

I suspect I can get the tableView to scroll properly if I can somehow pass the indexPath.row in the textFieldDidBeginEditing method?

Any help is appreciated.

like image 414
Lauren Quantrell Avatar asked Mar 10 '11 20:03

Lauren Quantrell


1 Answers

In my app, I have successfully used a combination of contentInset and scrollToRowAtIndexPath like this:

When you want to display the keyboard, just add a contentInset at the bottom with your table with desired height:

tableView.contentInset =  UIEdgeInsetsMake(0, 0, height, 0); 

Then, you can safely use

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:cell_index inSection:cell_section] animated:YES]; 

By adding the contentInset, even if you are focusing on the last cell the tableView will still be able to scroll. Just make sure that when you are dismissing the keyboard, you reset the contentInset.

EDIT:
If you have only one section (you can replace cell_section with 0) and the use the textView tag to inform the cell row.

like image 88
Andrei Stanescu Avatar answered Sep 18 '22 18:09

Andrei Stanescu