Ios 在文本字段中输入文本时,文本字段会下降到键盘下方
关于在文本字段中输入文本,我有一个奇怪的问题。我目前正在使用下面的代码。我的代码是按照答案建模的 在我的视图中,我有一个表视图,其中一个获取的结果控制器作为其数据源,下面是堆栈视图中的文本字段,称为mainStackView,最终保存在核心数据存储中Ios 在文本字段中输入文本时,文本字段会下降到键盘下方,ios,swift,Ios,Swift,关于在文本字段中输入文本,我有一个奇怪的问题。我目前正在使用下面的代码。我的代码是按照答案建模的 在我的视图中,我有一个表视图,其中一个获取的结果控制器作为其数据源,下面是堆栈视图中的文本字段,称为mainStackView,最终保存在核心数据存储中 我已经用相同的结果对这段代码进行了多次迭代,无论是计算第一响应程序的偏移量,还是简单地计算堆栈视图。当文本字段成为第一个响应者时,视图会随着键盘向上滑动。但是,只要我尝试在字段中键入,视图就会恢复到其原始位置。我确信我犯了一个新手错误,但我不知道我
我已经用相同的结果对这段代码进行了多次迭代,无论是计算第一响应程序的偏移量,还是简单地计算堆栈视图。当文本字段成为第一个响应者时,视图会随着键盘向上滑动。但是,只要我尝试在字段中键入,视图就会恢复到其原始位置。我确信我犯了一个新手错误,但我不知道我做错了什么,我在搜索中没有发现任何东西,除了一个关于android的类似问题。提前感谢。虽然我还没有确定我在更改帧时看到的文本字段行为的原因,但我可以通过使用CGAffineTransform来停止该行为。我的代码是:
@objc func keyboardFrameChangeNotification(notification: Notification) {
if let userInfo = notification.userInfo {
let keyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect
let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double ?? 0
let animationCurveRawValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? Int) ?? Int(UIViewAnimationOptions.curveEaseInOut.rawValue)
let animationCurve = UIViewAnimationOptions(rawValue: UInt(animationCurveRawValue))
if let _ = keyBoardFrame, keyBoardFrame!.intersects(self.mainStackView.frame) {
self.offsetY = self.mainStackView.frame.maxY - keyBoardFrame!.minY
let transformUp = CGAffineTransform.init(translationX: 0, y: (0 - self.offsetY))
UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
self.mainStackView.transform = transformUp
self.rocketSelectTable.transform = transformUp
}, completion: nil)
} else {
if self.offsetY != 0 {
UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
self.mainStackView.transform = CGAffineTransform.identity
self.rocketSelectTable.transform = CGAffineTransform.identity
self.offsetY = 0
}, completion: nil)
}
}
}
此代码平滑地设置视图移动的动画,并且在文本字段中键入时不会捕捉回原始位置。我希望这对其他人有所帮助。代码中的某个缩进丢失了;看到尾随的close curly了吗?上面问题中显示的代码看起来不错。我猜问题出在代码中的其他地方,您没有添加到问题中。也许你可以补充一些细节?我真的不知道要补充什么。我有用于表视图的标准委托方法。有7个文本字段和相应的标签。我关心的是一个在其中一个文本字段中执行自动完成的函数,但我没有做任何更改就将其注释掉了。另一个处理文本字段的函数是
@IBAction func didEndEditing
,该函数由IB发送的“editing did end”事件触发。我还在每个函数中放置断点,并且不调用任何断点。我希望我发布的代码中有一些错误导致了它。
@objc func keyboardFrameChangeNotification(notification: Notification) {
if let userInfo = notification.userInfo {
let keyBoardFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect
let animationDuration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double ?? 0
let animationCurveRawValue = (userInfo[UIKeyboardAnimationCurveUserInfoKey] as? Int) ?? Int(UIViewAnimationOptions.curveEaseInOut.rawValue)
let animationCurve = UIViewAnimationOptions(rawValue: UInt(animationCurveRawValue))
if let _ = keyBoardFrame, keyBoardFrame!.intersects(self.mainStackView.frame) {
self.offsetY = self.mainStackView.frame.maxY - keyBoardFrame!.minY
let transformUp = CGAffineTransform.init(translationX: 0, y: (0 - self.offsetY))
UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
self.mainStackView.transform = transformUp
self.rocketSelectTable.transform = transformUp
}, completion: nil)
} else {
if self.offsetY != 0 {
UIView.animate(withDuration: animationDuration, delay: TimeInterval(0), options: animationCurve, animations: {
self.mainStackView.transform = CGAffineTransform.identity
self.rocketSelectTable.transform = CGAffineTransform.identity
self.offsetY = 0
}, completion: nil)
}
}
}