2012-10-31 4 views
5

self.viewより少し大きいUITableViewがあります。ビューの一番下にUITextFieldがあり、テキストフィールドの編集が開始されると、デリゲートメソッド– textFieldDidBeginEditing:を使用してビューを移動します。UITableViewのcontentOffsetを設定してから、オフセットを新しい位置にジャンプします。

これはうまくいきますが、UITextFieldが編集されている(コンテンツが既にオフセットされている)ときにビューをスクロールしようとすると、コンテンツがビューの下部の適切な位置に動きます。言い換えれば、私が設定したcontentOffset.yは、コンテンツビューのサイズに等しくなるように変更されています(通常の動作で予想されるように)。

編集中にこの動作を上書きする方法はありますか?

- (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]; 
} 

答えて

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にとって悪いのかどうかを判断する必要があります。

1

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

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

した後停止し、彼らがフォーカスを取得する際のUITableView内の入力フィールドで起こる自動スクロールを。ありがとう@スクエアフロッグ

関連する問題