具有多个 UITextFields 的 iOS UITableViewCell 子类滚动出视图
Posted
技术标签:
【中文标题】具有多个 UITextFields 的 iOS UITableViewCell 子类滚动出视图【英文标题】:iOS UITableViewCell subclass with multiple UITextFields scrolls out of view 【发布时间】:2015-10-07 21:07:14 【问题描述】:一些背景:
我正在使用UITableViewController
子类来获取一长串不同类型的单元格。所以从技术上讲,这不是对UITableViewController
或UITableView
的适当使用。但是,我正在使用大型遗留代码库 - 重构这不是一种选择。
其中一个单元,我们称之为ProductListCell
,由多个视图组成(每个视图都应该是一个单元,但又是大型遗留代码库),它们以编程方式组合在一起。
当单元格的数据在cellForRowAtIndexPath:
中提供时,视图,让我们调用ProductListView
绘制在笔尖上,但以编程方式与ProductListCell
中的约束一起拍打。每个ProductListView
s 都有一个UITextField
。所以这个ProductListCell
中有多个UITextFields
。
问题: 有时,并非总是如此,当点击文本字段并出现键盘时,文本字段会被推到视线之外。
我尝试将ProductListView
中的文本字段通过superview 单元格传递到UITableViewController
子类,并观察键盘出现,然后将scrollToRectVisible:
传递给文本字段。不管有没有[self.tableView convertPoint:fromView:];
,我都做到了。
我确实认为,因为未定义此 UITableViewController
中多个单元格的高度,而是根据提供给它们的数据动态地定义,它与默认的键盘外观滚动行为相混淆。
有人遇到过类似的问题吗?
编辑:我应该提到 - 我的猜测是 UITableViewController
知道如何在单元格中显示文本字段。但是当一个单元格中有多个文本字段时,我相信它只会关注单元格,而不是特别关注文本字段。
【问题讨论】:
您使用自定尺寸单元格吗? TVC 应滚动以显示选定的文本字段 @Andy 是的,当它的单元格中有文本字段时,TVC 应该知道使用文本字段转到单元格。但是当单元格中有多个 textfields 时呢?我认为 TVC 不知道要转到哪个文本字段。只是一般的单元格。 【参考方案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 : 表格视图单元格中的文本字段高度
【讨论】:
以上是关于具有多个 UITextFields 的 iOS UITableViewCell 子类滚动出视图的主要内容,如果未能解决你的问题,请参考以下文章
在 UIButton 点击上添加多个 UITextFields
iOS 13 禁用 UITextFields 的浮动键盘功能