4

ビューとテーブルビューの分割ビューコントローラーがあります。このテーブル ビューには、テキスト フィールドを持つカスタム セルがあります。セルがいくつになるかわからないので、自動生成します。そして、FirstResponderになったら、テキストフィールドにスクロールしようとしています。私はこのようなことを試しました:

-(void) textFieldDidBeginEditing:(UITextField *)textField {
    CGPoint focusOnTextField = CGPointMake(0, 300 + textField.frame.origin.y);
    [scroller setContentOffset: focusOnTextField animated: YES];
}

300px - TableView の開始位置。すべて問題ないように見えますが、textField.frame.origin.y常に 0 に等しくなります (同様に、bounds.origin.yところで)。

テキストフィールドがアクティブなセルの位置を取得してから、onなどに置き換えると問題を解決できると思いtextField.frame.origin.yましcell.frame.origin.yた。

================================================== =================

テーブルビューのスクロールが無効になっていることを忘れていました。私はあなたのアドバイスとコード例に従い、そのように解決します:

- (UITableViewCell *)cellWithSubview:(UIView *)subview {

    while (subview && ![subview isKindOfClass:[UITableViewCell self]])
        subview = subview.superview;
    return (UITableViewCell *)subview;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *activeCell = [self cellWithSubview:textField];

    float offsetValueY = 200 + activeCell.origin.y;
    CGPoint focusOnTextField = CGPointMake(0, offsetValueY);
    [scroller setContentOffset:focusOnTextField animated:YES];
}

そして、何を知っていますか?それは働いている!:-) しかし、それは新しい問題を引き起こします。テキストフィールドの編集を開始すると、最初にスクローラーが一番上にジャンプしてから、正しい位置に移動します。書いてみる[scroller setContentOffset:focusOnTextField animated:NO];とこの問題はなくなりますが、スクローラーの動きがスムーズではありません。そして、これは私にとって悪いことです:-)では、どうすれば解決できるのでしょうか?

4

3 に答える 3

5

テキストフィールドを含むセルにスクロールする方法は次のとおりです...

// find the cell containing a subview.  this works independently of how cells
// have been constructed.

- (UITableViewCell *)cellWithSubview:(UIView *)subview {

    while (subview && ![subview isKindOfClass:[UITableViewCell self]])
        subview = subview.superview;
    return (UITableViewCell *)subview;
}

編集の開始時にそのアクションをトリガーするというあなたの考えは正しいです。セルを使用してそれを行うだけです...

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    // find the cell containing this text field
    UITableViewCell *cell = [self cellWithSubview:textField];

    // now scroll using that cell's index path as the target
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
于 2013-05-14T16:05:15.897 に答える
2

コンテンツビューにテキストフィールドを追加する場合UITableVieCell(.xibを使用している場合はデフォルトで追加されます)、次のようなものを呼び出す必要がtextField.superview.superviewあり、これにより親セルが得られます. テキスト フィールドをセル ビューに直接追加する場合は、textField.superview.

于 2013-05-14T15:53:45.310 に答える
1
[tableView scrollToRowContainingComponent:textField atScrollPosition: UITableViewScrollPositionMiddle animated:YES];

次のカテゴリを UITableView に追加した後:

@implementation UITableView (MyCategory)

-(NSIndexPath*)indexPathOfCellComponent:(UIView*)component {
    if([component isDescendantOfView:self] && component != self) {
        CGPoint point = [component.superview convertPoint:component.center toView:self];
        return [self indexPathForRowAtPoint:point];
    }
    else {
        return nil;
    }
}

-(void)scrollToRowContainingComponent:(UIView*)component atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated {

    NSIndexPath *indexPath = [self indexPathOfCellComponent:component];
    if(indexPath) {
        [self scrollToRowAtIndexPath:indexPath atScrollPosition: scrollPosition animated:animated];
    }
}

@end
于 2013-05-14T16:04:54.233 に答える