【问题标题】:iOS UITableViewCell subclass with multiple UITextFields scrolls out of view具有多个 UITextFields 的 iOS UITableViewCell 子类滚动出视图
【发布时间】:2015-10-07 21:07:14
【问题描述】:

一些背景: 我正在使用UITableViewController 子类来获取一长串不同类型的单元格。所以从技术上讲,这不是对UITableViewControllerUITableView 的适当使用。但是,我正在使用大型遗留代码库 - 重构这不是一种选择。

其中一个单元,我们称之为ProductListCell,由多个视图组成(每个视图都应该是一个单元,但又是大型遗留代码库),它们以编程方式组合在一起。

当单元格的数据在cellForRowAtIndexPath: 中提供时,视图,让我们调用ProductListView 绘制在笔尖上,但以编程方式与ProductListCell 中的约束一起拍打。每个ProductListViews 都有一个UITextField。所以这个ProductListCell中有多个UITextFields

问题: 有时,并非总是如此,当点击文本字段并出现键盘时,文本字段会被推到视线之外。

我尝试将ProductListView 中的文本字段通过superview 单元格传递到UITableViewController 子类,并观察键盘出现,然后将scrollToRectVisible: 传递给文本字段。不管有没有[self.tableView convertPoint:fromView:];,我都做到了。

我确实认为,因为未定义此 UITableViewController 中多个单元格的高度,而是根据提供给它们的数据动态地定义,它与默认的键盘外观滚动行为相混淆。

有人遇到过类似的问题吗?

编辑:我应该提到 - 我的猜测是 UITableViewController 知道如何在单元格中显示文本字段。但是当一个单元格中有多个文本字段时,我相信它只会关注单元格,而不是特别关注文本字段。

【问题讨论】:

  • 您使用自定尺寸单元格吗? TVC 应滚动以显示选定的文本字段
  • @Andy 是的,当它的单元格中有文本字段时,TVC 应该知道使用文本字段转到单元格。但是当单元格中有多个 textfields 时呢?我认为 TVC 不知道要转到哪个文本字段。只是一般的单元格。

标签: ios objective-c iphone uitableview cocoa-touch


【解决方案1】:

动态内容不应 问题。作为键盘,它的高度是固定的。您只需要滑动现在显示键盘的区域。注册keyboardNotifications,试试这个可能会有帮助。

CGSize kbSize = [[[sender userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
NSTimeInterval duration = [[[sender userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

CGFloat height = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? kbSize.width : kbSize.height;

[UIView animateWithDuration:duration animations:^{
UIEdgeInsets edgeInsets = _generalTableView.contentInset;
edgeInsets.bottom += height;
_generalTableView.contentInset = edgeInsets;
edgeInsets = _generalTableView.scrollIndicatorInsets;
edgeInsets.bottom += height;
_generalTableView.scrollIndicatorInsets = edgeInsets;
}];

【讨论】:

    【解决方案2】:

    以下代码将您的文本字段保持在视图的顶部。 您可以将此代码添加到UITextField 的委托方法之一textFieldDidBeginEditing

    CGRect frame = CGRectZero;
    frame.origin.x = 0;
    frame.origin.y = textField.tag*ROW_HEIGHT+textField.frame.origin.y+textField.frame.size.height*2+5;
    frame.size.width = self.view.frame.size.width;
    frame.size.height = RESULTS_TABLE_HEIGHT;
    [self.tableView setContentOffset:CGPointMake(0, frame.origin.y-30)animated:YES]; 
    

    // 30 : 表格视图单元格中的文本字段高度

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多