ios - InputAccessoryView 停靠在底部

标签 ios uinavigationcontroller uitoolbar uikeyboard uiresponder

我正在尝试实现与 Apple 消息应用中底部文本输入栏类似的定位行为。

我尝试了很多方法,到处搜索,有很多类似的问题,但没有一个是令人满意的。

要指定:

  1. 在 View 底部有一个UIToolbar
  2. 工具栏随着键盘的出现和消失而跟随键盘
  3. 当键盘可见时,工具栏应位于键盘上方
  4. 当键盘隐藏时,工具栏保持(“停靠”)在 View 的底部

建议的解决方案:

手动设置工具栏动画以响应键盘出现通知

这个解决方案不满足第二个需求的特殊情况(工具栏随着键盘出现和消失):

  • 在 iOS 7 中,引入了 UIScrollViewKeyboardDismissMode。它启用用于关闭键盘的交互式手势。当用户平移过键盘的顶部边缘时,键盘框架逐渐跟随。此解决方案无法适应此行为,只会让工具栏停留在其动画位置。

此外,该解决方案也无法满足第三个要求的特殊情况(当键盘可见时,工具栏应保持在键盘顶部):

  • 旋转。此解决方案需要额外的、令人讨厌的无关代码(正如我们将在下一个提议的解决方案中看到的那样)来旋转工具栏以响应设备旋转。

此解决方案的另一个问题:

  • 键盘高度。使用此解决方案,工具栏不会被假定为键盘高度的一部分,因此必须编写额外的代码来支持内容的正确插入。

下一个建议的解决方案:

使用UIResponderinputAccessoryView

这个解决方案似乎是 Apple 打算支持这种行为的方式,因为它解决了手动设置工具栏动画的所有缺点。但是这个解决方案完全忽略了第四个要求(当隐藏键盘时,工具栏保持(“停靠”)在 View 的底部)。


似乎解决方案是使用 UIResponderinputAccessoryView,但不知何故使 inputAccessoryView 不会移动到 View 下方。我正在寻找干净的代码来完成这个。别处有精心设计的、近乎崇高的尝试,但如前所述,它们不符合要求。

在我的特殊情况下,我希望使用 UINavigationController 的工具栏,这会带来其他问题,因为这不是 UINavigationController 的预期行为。没关系,我愿意引入一些 hacky 修复来实现这一点。

最佳答案

Jason Foreman (@threeve) 刚刚向我展示了“那个”解决方案。在您的 View Controller (是的, View Controller )上添加 inputAccessoryView: 并返回您想要停靠在底部并使用键盘移动的 View 。它只是工作。 View 实际上不需要位于您的 View 层次结构中,它将由 View Controller 自动插入。

编辑:还实现 canBecomeFirstResponder 并返回 YES(如 Max Seelemann 所述)。 reloadInputViews 也很方便。

关于ios - InputAccessoryView 停靠在底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19764293/

相关文章:

iphone - View Controller 之间的通信

ios - 以编程方式定义新的导航 Controller 顺序/堆栈?

iphone - 在 iPad 的 DetailViewController ToolBar 上添加工具栏项或按钮

swift - 如何在 Swift 的工具栏顶部居中分段控件?

ios - 如何对自定义 NSArray 进行排序?

objective-c - NSString 解析以查找日期

ios - 如何在 swift 中使用 FMDB 以异步模式插入数据?

ios - pushViewController 不工作

UIToolbar 中的 iOS UISearchbar,在 iPad 中显示搜索结果而不是弹出窗口

ios - 将手势识别器实现为两个 View Controller 之间的 Segue