簡體   English   中英

出現鍵盤時滾動Group tableView

[英]Scroll Group tableView when keyboard appears

我正在嘗試創建一個視圖,用戶可以在其中輸入他的信息(姓名,電子郵件,個人簡歷...)。

為此,我使用具有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];
    }
}

我會嘗試這樣的事情:

。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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM