2

ユーザーが自分の情報 (名前、電子メール、経歴など) を入力するビューを作成しようとしています。

UITextFieldこれを行うために、5 つのセクション ( 0..4 ) を持つグループ テーブル ビューを使用していUITextViewます。

ユーザーがこれらの textFields/textView のいずれかをタップすると、キーボードが表示され、セル (選択された textField/textView を含む) がキーボードのすぐ上の位置までスクロールします。

私の問題は、セクション 4 の textView にあります。キーボードが表示されると、何らかの形でセルが自動的にスクロールして表示されますが、正確には正しい位置にはなりません (テキスト ビューの半分がキーボードの後ろに隠れています)。
自分でスクロールしようとすると(キーボードのアニメーションが終了した後)、textView の醜いバウンスが発生します。

醜いバウンスの原因は、キーボードが表示されたときに textView が自動スクロールすることと、私のスクロールであることがわかります。この動作 (自動スクロール) は、textView に対してのみ発生します。たとえば、セクション 4 で textView の代わりに textField を使用すると、自動的にスクロールしません。

問題は、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];
    }
}
4

1 に答える 1