我有一个拆分视图控制器:view&实现代码如下。在此表视图中,我有自定义单元格和文本字段。我不知道我有多少个细胞,所以它会自动生成。现在我正在尝试滚动到textfield,当它成为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
btw一样)。
我认为如果获取单元格的位置,文本字段处于活动状态,然后替换textField.frame.origin.y
上的cell.frame.origin.y
或类似的内容,我可以解决问题。
============================================ =======================
我忘了说我的tableviews滚动被禁用了。我按照你的建议和代码示例解决它:
- (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];
时,这个问题就消失了,但滚动没有顺利移动。这对我不好:-)所以我们如何解决它?
答案 0 :(得分: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];
}
答案 1 :(得分:2)
如果您在UITableVieCell
内容视图中添加文本字段(默认情况下,如果您使用的是.xib),那么您必须调用类似textField.superview.superview
的内容,这将为您提供父细胞。如果将文本字段直接添加到单元格视图,则必须textField.superview
。
答案 2 :(得分: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