UITableViewController 中的键盘重叠文本字段
Posted
技术标签:
【中文标题】UITableViewController 中的键盘重叠文本字段【英文标题】:Keyboard overlapping textfields in UITableViewController 【发布时间】:2015-04-15 15:10:24 【问题描述】:UITableViewController 自动管理文本字段编辑:滚动到可编辑内容,更改插图以在屏幕上同时显示文本字段和键盘,而不会出现键盘重叠。这是一个非常酷的功能,因为我不需要编写大量代码来计算新插图、滚动到内容、检查 deviceOrientation 是否更改或键盘是否隐藏等等。
但是当我们使用 SplitViewController 时,该功能失败,在我们添加到 root 之后,控制器自动管理文本字段仅适用于面向 Pad 的屏幕。我认为这是Apple的错误,但也许这是我的错误,我做错了什么?我检查了 SplitViewController -> Navigation Controller -> UITableViewController 层次结构在 Apple 的 HID 中是否正确。
我已经为这个问题编写了一个简单的应用程序,所以如果你愿意,你可以看到那个错误,我该如何修复它?
链接到带有该错误的简单、新鲜的 XCode 项目:https://www.dropbox.com/s/o315awgonzeskeo/TableEditing.zip?dl=0
半解决方案:如果设备是 iPhone,则删除 SplitViewController。在 iPad 上一切正常,但在 iPhone 上却不行,所以我们可以试试:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let rootController = storyboard.instantiateViewControllerWithIdentifier("navigation") as! UINavigationController
if UIDevice.currentDevice().userInterfaceIdiom != .Pad
// setting non-split rootView if device is iPhone
self.window!.rootViewController = rootController
但是有一个问题——我们在 iPhone 6 Plus 上失去了 SplitViewController(我检查过,在 iPhone 6 Plus 上,纵向键盘仍然重叠,横向键盘一切正常)。所以这不是解决方案。
【问题讨论】:
奇怪的行为。在 ios9 中,苹果似乎修复了这个 bug,因此需要对旧版本进行另一种特殊处理。 【参考方案1】:尝试将此代码设置为UITableViewController
:
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:YES];
注意:UITableViewController 在 iOS 3.0 中有新功能。一种 表视图控制器支持表视图行的内联编辑;如果, 例如,行在编辑模式下嵌入了文本字段,它 在虚拟键盘上方滚动正在编辑的行
【讨论】:
dropbox.com/s/o315awgonzeskeo/TableEditing.zip?dl=0 我的新测试项目,请阅读有关 SplitViewController 的信息(我已经更新了帖子)。【参考方案2】:只需通过设置内容大小来增加 tableview 高度的大小
tableView.contentSize = CGSizeMake(widthYouWant, heightYouWant);
或通过 nib 的 tableview 框架部分中的 tableview 底部内容插入。然后通过调用将该行滚动到顶部
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
如果这就是你要找的东西,请告诉我
【讨论】:
我不知道tableView的高度,可能有很多不同高度的行。而且我的字段总是在表格的最后,所以我不能只滚动到它,它会留在底部,因为它是表格中的最后一个元素。 我不在我的 Macbook 上,不知道确切的术语。进入你的 Xib 文件。然后选择tableview,然后转到右侧菜单部分的框架部分。然后将底部插入设置为 200(键盘高度) 底部内容插入【参考方案3】:您可以尝试将 TPKeyboardAvoiding 添加到您的项目中
TPKeyboardAvoiding - 在 iOS 中将文本字段移出键盘的嵌入式通用解决方案。
要与 UITableViewController 类一起使用,请将 TPKeyboardAvoidingTableView.m 和 TPKeyboardAvoidingTableView.h 放入您的项目中,并将您的 UITableView 设置为 xib 中的 TPKeyboardAvoidingTableView。
【讨论】:
我正在寻找原生解决方案,我认为它存在于 UITableViewController iOS8 中的内置解决方案。【参考方案4】:作为一个选项,您可以订阅键盘通知,例如:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:self.view.window];
然后当键盘即将显示时,将您的视图向上移动一些像素,以便最后一行可见。当键盘隐藏时 - 将其向下移动。
【讨论】:
【参考方案5】:处理这种情况的最佳方法是手动控制您的UITableView
并将其移动到键盘上方。我已经为它创建了small class,如果键盘出现/消失,它会增加和减少约束的大小(它可能是从UITableView
到视图底部的约束)。
【讨论】:
以上是关于UITableViewController 中的键盘重叠文本字段的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewController 中的 iOS tableHeaderView 从不显示
框架中的 UITableViewController 未调用 didSelectRowAtIndexPath