我正在尝试为iPhone构建输入屏幕 . 屏幕有许多输入字段 . 其中大多数位于屏幕顶部,但两个字段位于底部 . 当用户尝试编辑屏幕底部的文本时,键盘将弹出并覆盖屏幕 . 我找到了一个简单的解决方案,可以在发生这种情况时将屏幕向上移动,但结果是屏幕总是向上移动,当用户尝试编辑屏幕时,屏幕顶部的字段会移动 .
有没有办法让屏幕只在编辑底部字段时移动?
我用过这个代码我发现here:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
23 回答
您的问题在this document by Apple中得到了很好的解释 . 此页面上的示例代码(位于
Listing 4-1
)完全符合您的需要,只有在当前编辑应位于键盘下方时才会滚动视图 . 您只需要将所需的控件放在scrollViiew中 . 唯一的问题是这是Objective-C,我认为你需要它在Swift中...所以它是:它是:声明一个变量
然后添加这些方法
确保将ViewController声明为
UITextFieldDelegate
并在初始化方法中设置正确的委托:ex:并记得在viewInit上调用
registerForKeyboardNotifications
,在退出时调用deregisterFromKeyboardNotifications
.编辑/更新:Swift 3.0语法
这是我的2美分:
你试过吗:https://github.com/hackiftekhar/IQKeyboardManager
非常容易安装Swift或Objective-C .
它是如何工作的:
IQKeyboardManager(Swift): - IQKeyboardManagerSwift可通过CocoaPods获得,安装它只需将以下行添加到您的Podfile:(#236)
在AppDelegate.swift中,只需导入IQKeyboardManagerSwift框架并启用IQKeyboardManager .
这就是全部 . 简单!
我发现对我来说完美的工作是:
您还可以更改高度值 . 如果要将其用于所有文本字段,请删除“if语句” .
您甚至可以将此用于需要用户输入的所有控件,如TextView .
我遇到了类似的问题,并使用scrollView找到了一个非常直接的解决方案 without ,而是在keyboardWillShow / Hide方法中使用if语句 .
这对我来说是一个很好的解决方案,因为我只有两个文本字段 .
Shifts whole view up: 仅在编辑某些文本字段(bottomText)时
Shifts whole view down: 仅当视图不在原始位置时
为什么不在UITableViewController中实现呢?键盘在显示时不会隐藏任何文本字段 .
Swift 4 (updated )延期
在一个容器中添加按钮
使用IBOutlet containerBtmConstrain连接容器的底部约束
inViewDidLoad
我认为这个条款是错误的:
虽然activeField的起源可能在键盘上方,但maxY可能不会...
我会为activeField创建一个'max'点并检查它是否在键盘Rect中 .
我使用SwiftLint,它对接受的答案的格式有一些问题 . 特别:
冒号之前没有空格,没有强制转换,更喜欢UIEdgeInset(顶部:等等...而不是UIEdgeInsetMake .
所以这里是Swift 3的更新
只需使用此扩展名即可在键盘出现时移动任何UIView .
然后在viewdidload中将视图绑定到键盘
阅读Apple提供的文档和之前的帖子后,这是我的版本 . 我注意到的一件事是当键盘覆盖时没有处理textView . 遗憾的是,Apple的文档无法正常工作,因为无论出于何种原因,在调用textViewDidBeginEditing之后调用键盘 . 我通过调用一个中央方法来检查键盘是否显示以及是否正在编辑textView或textField . 这样,只有当BOTH条件存在时才会触发该过程 .
textViews的另一个要点是它们的高度可能会使键盘剪切textView的底部,如果在视图中的左上角点则不会调整 . 因此,我编写的代码实际上采用任何textView或textField的屏幕引用的Bottom-Left点,并查看它是否落在所呈现的键盘的屏幕引用坐标中,暗示键盘覆盖了它的一部分 .
如果您使用的是导航控制器,子类还会将插件的滚动视图自动调整设置为false .
它遍历每个textView和textField以设置委托以进行处理
只需将基类设置为此处为结果创建的子类 .
在下面的示例中,我只是在开始编辑txtLastName或txtCity时向上移动视图 . 我创建了变量keyboardActive,因为如果我点击txtLastName并在txtCity之后,视图可以向上移动2倍 .
看看它是否适合你 .
在ReactNative android和IOS应用程序中这样的问题通过以下步骤解决 .
像这样安装包 .
现在将键盘spacer插入到React Native项目中的js或jsx文件中 .
然后解决在写入时隐藏文本字段的键盘问题 .
已经给出了很棒的答案,但这是处理这种情况的另一种方法(使用 Swift 3x ):
首先在
viewWillAppear()
中调用以下方法现在拿
UIView
的UIView
的UIView
的顶部约束如下:(这里UIView
是UIScrollView
的子视图,这意味着你的所有subViews
应该有一个UIScrollView
)另一个变量如跟随并添加一个委托,即
UITextFieldDelegate
:之后,这是神奇的部分,只需粘贴下面的代码段:
现在最后一个片段:
不要忘记将代表分配给
UIStoryboard
中的所有UITextField
祝好运!
Swift 3 syntax:
这是一个很好的方法来获得你想要的你可以为某些文本字段添加“if”条件,但这种类型适用于所有...希望它对每个人都有用
“我忘了提到我是Swift的新手:(检查这个的正确语法是什么?(如何在此函数中获取字段名称?)”
好 . 首先确认UITextFieldDelegate协议
然后实现该功能
您应该注意,正确的方法是使用滚动视图并放置应在滚动视图内上下移动的视图,并相应地处理键盘事件
此代码向上移动您正在编辑的文本字段,以便您可以在Swift 3中查看它以获得此答案,您还必须使您的视图成为UITextFieldDelegate:
然后在viewDidLoad中:
哪个调用(在viewDidLoad之外):
斯威夫特3
被接受的anwser几乎是完美的 . 但我需要使用
UIKeyboardFrameEndUserInfoKey
而不是UIKeyboardFrameBeginUserInfoKey,
,因为后者返回keyborad高度0.并将hittest点更改为底部而不是原点 .首先声明一个变量来标识您的活动UITextField .
步骤1:-
像
var activeTextField: UITextField
一样?第2步: - 之后在viewDidLoad中添加这两行 .
第3步: -
现在在控制器类中定义这两个方法 .
Swift 4 Updated my solution
键盘上的约束动画显示/隐藏,享受 .
Swift 4
你可以轻松地上下移动
UITextField
与键盘与动画Swift 4.2
如果它的位置在键盘下方,我的解决方案将(垂直)将视图置于
UITextField
的中心 .第1步:创建新的swift文件并复制粘贴
UIViewWithKeyboard
类 .第2步:在Interface Builder中将其设置为最顶层
UIView
的自定义类 .//制作一个uitextfield变种
//在你的viewdid加载中
//知道点击的文本字段 . 可能你在整个屏幕上都有文本字段 .
//检查键盘是否覆盖文本字段 .
//返回关闭键盘