2012-08-25 41 views
2

我试图创建一个视图,其中用户输入他的信息(名称,电子邮件,生物...)。键盘出现时滚动组tableView

要做到这一点,我使用了一个5段(0..4)的组表格视图,每个单元格里面有一个UITextField(除了第4节中有UITextView的单元格)。

当用户点击其中一个textFields/textView时,键盘出现,单元格(带有选定的textField/textView)滚动到键盘正上方的位置。

我的问题是在第4节的textView时,当键盘出现时它会自动将单元格滚动到可见,但不完全在正确的位置(文本视图的一半隐藏在键盘后面)。
当我尝试自己做滚动(键盘完成动画后),我得到了一个丑陋的textView反弹。

它接缝,丑陋的反弹的原因是textView自动滚动当键盘出现+我的滚动。这种行为(自动滚动)只发生在textView上,例如,如果我使用textField而不是第4节中的textView,它不会自动滚动。

所以问题是:我怎样才能顺利滚动textView到正确的位置?

这是我的代码:

#pragma mark - UITableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 5; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

    switch (indexPath.section) { 
     case 0: 
      [cell.contentView addSubview:self.textField1]; 
      break; 
     case 1: 
      [cell.contentView addSubview:self.textField2]; 
      break; 
     case 2: 
      [cell.contentView addSubview:self.textField3]; 
      break; 
     case 3: 
      [cell.contentView addSubview:self.textField4]; 
      break; 
     case 4: 
      // this is the text view 
      [cell.contentView addSubview:self.textView]; 
      break; 
     default: 
      break; 
    } 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 



#pragma mark - UITextFieldDelegate 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    self.activeResponder = textField; 
    return YES; 
} 

#pragma mark - UITextViewDelegate 

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { 
    self.activeResponder = textView; 
    return YES; 
} 

- (void)keyboardWillShow:(NSNotification*)notification { 
    NSLog(@"keyboard show"); 
    CGFloat animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

    CGRect tableViewFrame = self.tableView.frame; 
    tableViewFrame.size.height -= keyboardFrame.size.height; 

    [UIView animateWithDuration:animationDuration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.tableView.frame = tableViewFrame; 
    } completion:^(BOOL finished) { 
     [self scrollToActiveResponder]; 
    }]; 
} 

- (void)keyboardWillHide:(NSNotification*)notification { 
    NSLog(@"keyboard hide"); 
    CGFloat animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 

    CGRect tableViewFrame = self.tableView.frame; 
    tableViewFrame.size.height += keyboardFrame.size.height; 

    [UIView animateWithDuration:animationDuration delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     self.tableView.frame = tableViewFrame; 
    } completion:^(BOOL finished) { 
    }]; 
}  

- (NSIndexPath *)indexPathForActiveResponder { 
     NSIndexPath *indexPath = nil; 
     if (self.activeResponder == self.textField1) { 
      indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     } 
     else if (self.activeResponder == self.textField2) { 
      indexPath = [NSIndexPath indexPathForRow:0 inSection:1]; 
     } 
     else if (self.activeResponder == self.textField3) { 
      indexPath = [NSIndexPath indexPathForRow:0 inSection:2]; 
     } 
     else if (self.activeResponder == self.textField4) { 
      indexPath = [NSIndexPath indexPathForRow:0 inSection:3]; 
     } 
     else if (self.activeResponder == self.textView) { 
      indexPath = [NSIndexPath indexPathForRow:0 inSection:4]; 
     } 
     return indexPath; 
    } 

- (void)scrollToActiveResponder { 
    NSIndexPath *activeResponderIndexPath = [self indexPathForActiveResponder]; 
    if (activeResponderIndexPath) { 
     [self.tableView scrollToRowAtIndexPath:activeResponderIndexPath atScrollPosition:UITableViewScrollPositionNone animated:YES]; 
    } 
} 

回答

0

我会尝试这样的事:

.H

@interface YourViewController : UIViewController <UITextViewDelegate> 

.M

//Set delegate to your textView 
textView.delegate = self 

#pragma mark - TextView Delegate 
//TextView Became First Responder 
- (void)textViewDidBeginEditing:(UITextView *)textView{ 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:4]; 

    // Other way to get the IndexPath 
    //NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[textView superview] superview]]; 

    CGRect frame = [self.tableView rectForRowAtIndexPath:indexPath]; 

    //It only works for Portrait iPhone 
    CGFloat keyboardHeight = 216.0f; 

    CGPoint offset = CGPointMake(0, self.view.frame.size.height - keyboardHeight - frame.size.height - frame.origin.y); 
    [self.tableView setContentOffset:offset animated:YES]; 

} 

我没有测试它,但这是我会如何去尝试这个问题。你可以在这里找到更多关于如何计算键盘尺寸的信息:(http://www.idev101.com/code/User_Interface/keyboard.html