我有UITableViewController想要在用户使用scrollToRowAtIndexPath方法点击文本字段底部时滚动
// ViewController
@interface PersonalInfoViewController : UITableViewController{
}
在textFiled Delegate方法上。
-(void) textFieldDidBeginEditing:(UITextField *)textField {
UITableViewCell *textFieldRowCell = (UITableViewCell *) textField.superview.superview;;
NSIndexPath* path = [self.tableView indexPathForCell:textFieldRowCell];
[self performSelector:@selector(scrollToCell:) withObject:path afterDelay:0.5f];
}
//滚动方法
-(void) scrollToCell:(NSIndexPath*) path {
NSLog(@"%@",path);
[self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionNone animated:NO];
}
控制台O / P
//尺寸
NSLog(@"%@",NSStringFromCGSize(self.tableView.contentSize)); {320, 711.5}
// Bounds
NSLog(@"%@",NSStringFromCGRect(self.tableView.frame)); {{0, 0}, {320, 568}}
// IndexPath
<NSIndexPath: 0x8e981f0> {length = 2, path = 3 - 0}
<NSIndexPath: 0x8eaa600> {length = 2, path = 3 - 1}
<NSIndexPath: 0x9967d20> {length = 2, path = 2 - 1}
所以问题是。
我不这么认为使用scrollToRowAtIndexPath我们需要设置contectSize
和ContectOffset
伙计检查我的比赛大小和界限o / p。怎么说比赛大小小于高度
我发现UITableViewScrollPositionTop工作在行的顶部但不是最后4到5的底部
答案 0 :(得分:3)
以下是您的问题的答案: 因为您的内容高度小于tableview边界高度。
如果您真的需要它,这是工作解决方案
- (void)textFieldDidBeginEditing:(UITextField *)textField {
CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y);
scrollPoint = [_tableView convertPoint:scrollPoint fromView:textfield.superview];
[_tableView setContentOffset:scrollPoint animated:YES];
}
如果你很好奇,可以在这里深入探讨这个问题:How to make a UITextField move up when keyboard is present?
答案 1 :(得分:0)
您需要确保tableView's
contentSize足够大,以便将单元格置于这些位置。在这些情况下,您需要手动为这些单元格计算contentOffset。请尝试以下方法: -
-(void) textFieldDidBeginEditing:(UITextField *)textField {
CGPoint origin = textField.frame.origin;
CGPoint point = [textField.superview convertPoint:origin toView:self.tableView];
float navBarHeight = self.navigationController.navigationBar.frame.size.height;
CGPoint offset = tableView.contentOffset;
// Adjust the below value as you need
offset.y += (point.y - navBarHeight);
[tableView setContentOffset:o animated:YES];
}
答案 2 :(得分:0)
我的一个应用程序中遇到了类似的问题。
一般的想法是在UITableView的末尾添加透明视图。 您可以添加页脚或其他单元格。 视图的高度应为:tableView的高度 - 最后一个可见单元格的高度。
以下是我使用的解决方案:
- (void)updateFooterHeightForLastTableViewItem:(UITableView *)tableView {
NSInteger sectionNumber = [tableView numberOfSections] - 1;
CGFloat lastCellHeight = [self tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:sectionNumber] inSection:sectionNumber]];
_lastSectionFooterHeight = MAX(0, tableView.frame.size.height - lastCellHeight);
[tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionNumber] withRowAnimation:NO];
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (section == [tableView numberOfSections] - 1) {
return _lastSectionFooterHeight;
}
return 0;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
CGRect footerRect = CGRectMake(0, 0, 320, [self tableView:tableView heightForFooterInSection:section]);
UIView *footerView = [[UIView alloc] initWithFrame:footerRect];
[footerView setBackgroundColor:[UIColor clearColor]];
[footerView setUserInteractionEnabled:NO];
return footerView;
}