Sti*_*and 46 uitoolbar uinavigationcontroller uikeyboard uiresponder ios
我正在尝试实现与Apple的消息应用程序中底部文本输入栏类似的定位行为.
我尝试了许多方法,搜索高低,有许多类似的问题,但没有一个令人满意.
指定:
UIToolbar
视图的底部有一个建议的解决方案:
此解决方案不符合第二个要求的特殊情况(工具栏是在键盘出现和消失时跟随键盘):
UIScrollViewKeyboardDismissMode
被介绍了.它启用了用于解除键盘的交互式手势.当用户翻过键盘的顶部边缘时,键盘框架逐渐跟随.此解决方案无法容纳此行为,只是将工具栏搁置在其动画位置.此外,此解决方案也无法满足第三个要求的特殊情况(当键盘可见时,工具栏应保持在键盘顶部):
此解决方案的另一个问题:
下一个提出的解
UIResponder
的inputAccessoryView
这个解决方案似乎是Apple打算支持这种行为的方式,因为它解决了手动设置工具栏动画的所有缺点.但是这个解决方案完全忽略了第四个要求(当键盘被隐藏时,工具栏保持("停靠")在视图的底部).
似乎解决方案是使用UIResponder
's inputAccessoryView
,但不知何故使得inputAccessoryView
不移动到视图之下.我正在寻找干净的代码来实现这一目标.在其他地方有精心制作的,几乎是高贵的尝试,但如上所述,它们不符合要求.
在我的特定情况下,我希望使用UINavigationController
工具栏,这需要额外的问题,因为这不是预期的行为UINavigationController
.无论如何,我愿意介绍一些hacky修复来实现这一目标.
小智 57
我刚刚看到Jason Foreman(@threeve)的"解决方案".在视图控制器上(是的,视图控制器)添加inputAccessoryView:
并返回要在底部停靠的视图并使用键盘移动.它只是有效.视图实际上不需要位于视图层次结构中,视图控制器将自动插入该视图.
编辑:还实现canBecomeFirstResponder并返回YES(如Max Seelemann所述).reloadInputViews也很方便.
小智 30
Jonathan Badeen的上述解决方案为我工作.这里是来自Arik的代码,展示了如何实现它(这应该在适当的视图控制器中):
- (BOOL)canBecomeFirstResponder{
return YES;
}
- (UIView *)inputAccessoryView{
return self.inputAccessoryToolbar;
// where inputAccessoryToolbar is your keyboard accessory view
}
Run Code Online (Sandbox Code Playgroud)
对于那些寻找Swift版本的人:
将工具栏(在我的情况下myToolBar
')连接到视图控制器.然后覆盖canBecomeFirstResponder
方法并覆盖getter inputAccessoryView
变量.另外别忘了添加self.myToolBar.removeFromSuperview()
或者xcode会抱怨.
class ViewController: UIViewController {
@IBOutlet var myToolBar: UIToolbar!
override func canBecomeFirstResponder() -> Bool {
return true
}
override var inputAccessoryView:UIView{
get{
return self.myToolBar
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.myToolBar.removeFromSuperview()
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
Slack的优秀人员:SlackTextViewController提供了一个优秀的,易于实现的开源解决方案.
以下是如何使用停靠工具栏分四步实现视图:
创建一个MessageViewController
继承自SLKTextViewController
,不需要再编写代码的代码:
import Foundation
import UIKit
class MessageViewController: SLKTextViewController {
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
}
Run Code Online (Sandbox Code Playgroud)Slack团队的道具,用于提取这样一个有用的pod.
归档时间: |
|
查看次数: |
18265 次 |
最近记录: |