5

よりUITableView少し大きいがありself.viewます。ビューの下部にがあり、テキストフィールドの編集が開始されUITextFieldたら、delegateメソッドを使用してビューを上に移動します。– textFieldDidBeginEditing:

これは正常に機能しますが、編集中にビューをスクロールしようとするUITextFieldと(そしてコンテンツがすでにオフセットされている場合)、コンテンツはビューの一番下の「適切な」位置にジャークします。言い換えると、contentOffset.yIセットは、コンテンツビューのサイズと等しくなるように変更されます(通常の動作で期待されるように)。

編集中にこの動作をオーバーライドする方法はありますか?

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    // Scroll to the currently editing text field
    [self scrollViewToTextField:textField];

}

- (void)scrollViewToTextField:(id)textField
{
    // Set the current _scrollOffset, so we can return the user after editing
    _scrollOffsetY = self.tableView.contentOffset.y;

    // Get a pointer to the text field's cell
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview];

    // Get the text fields location
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView];

    // Scroll to cell
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES];
}
4

2 に答える 2

12

この動作を回避する方法はcontentInset、同時に適用することです。上記の例では、次のようになります。

- (void)scrollViewToTextField:(id)textField
{
    // Set the current _scrollOffset, so we can return the user after editing
    _scrollOffsetY = self.tableView.contentOffset.y;

    // Get a pointer to the text field's cell
    UITableViewCell *theTextFieldCell = (UITableViewCell *)[textField superview];

    // Get the text fields location
    CGPoint point = [theTextFieldCell convertPoint:theTextFieldCell.frame.origin toView:self.tableView];

    // Scroll to cell
    [self.tableView setContentOffset:CGPointMake(0, point.y - 12) animated: YES];

    // Add some padding at the bottom to 'trick' the scrollView.
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, point.y - 60, 0)];
}

次に、編集後にインセットを必ずリセットしてください。

- (void)textFieldDidEndEditing:(UITextField *)textField {
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}

このアプローチの注意点は- (void)scrollViewDidScroll:(UIScrollView *)scrollView、テキスト フィールドがまだ表示されていることを確認するために、メソッドにいくつかのチェックを実装する必要があることです。

これに代わる方法は、編集の開始時にスクロールを無効にし、終了時にスクロールを再度有効にすることです。このアクションがアプリケーションの UX に悪いかどうかを判断する必要があります。

于 2012-10-31T16:03:19.107 に答える
1

入力テキストフィールドを使用している場合は、それを追加したいと思います。スクロールしてから、次を使用して EdgeInset を適用する firstResponder を適用する必要があります。

[self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:YES];
[self.tableView setContentInset:UIEdgeInsetsZero];

フォーカスを取得したときに UITableView 内の入力フィールドで発生する自動スクロールを停止した後。ありがとう@squarefrog

于 2013-03-28T12:30:15.327 に答える