2012-08-25 92 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

相關問題