当键盘出现时,如何使UITextField向上移动?

12 浏览
0 Comments

当键盘出现时,如何使UITextField向上移动?

如何防止UITextField被键盘遮挡?

0
0 Comments

问题的出现的原因是当键盘出现时,UITextField没有自动上移的功能。解决方法是通过编写一些简单的代码来实现UITextField的上移。

以下是用Swift 4编写的解决方法的代码:

func textFieldDidBeginEditing(_ textField: UITextField) {

moveTextField(textfield: textField, moveDistance: -250, up: true)

}

func textFieldDidEndEditing(_ textField: UITextField) {

moveTextField(textfield: textField, moveDistance: -250, up: false)

}

func moveTextField(textfield: UITextField, moveDistance: Int, up: Bool) {

let moveDuration = 0.3

let movement: CGFloat = CGFloat(up ? moveDistance: -moveDistance)

UIView.beginAnimations("animateTextField", context: nil)

UIView.setAnimationBeginsFromCurrentState(true)

UIView.setAnimationDuration(moveDuration)

self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

UIView.commitAnimations()

}

代码中的`moveTextField`函数负责移动UITextField的位置。当UITextField开始编辑时,调用`textFieldDidBeginEditing`函数,将上移的距离设为-250,并将布尔值`up`设为true。当UITextField结束编辑时,调用`textFieldDidEndEditing`函数,将上移的距离设为-250,并将布尔值`up`设为false。

`moveTextField`函数中的动画部分使用了`UIView`的动画方法来实现平滑的移动效果。在动画开始时,将视图的frame按指定的距离上移或下移,并设置动画的持续时间为0.3秒。

你可以根据你的UITextField的位置来调整-250的值。

0
0 Comments

问题的出现原因:

- 当用户点击文本框开始输入时,键盘会弹出,遮住了文本框,导致用户无法看到自己正在输入的内容。

解决方法:

- 在文本框开始编辑时,通过改变视图的位置将文本框向上移动,以使其可见。

- 在文本框结束编辑时,将视图位置恢复到原来的位置。

下面是用Swift语言实现的简单解决方案。我将一些过去在Objective-C中使用过的代码进行了翻译。

func textFieldDidBeginEditing(textField: UITextField) { // 成为第一响应者

// 将文本框向上移动

let myScreenRect: CGRect = UIScreen.mainScreen().bounds

let keyboardHeight : CGFloat = 216

UIView.beginAnimations( "animateView", context: nil)

var movementDuration:NSTimeInterval = 0.35

var needToMove: CGFloat = 0

var frame : CGRect = self.view.frame

if (textField.frame.origin.y + textField.frame.size.height + UIApplication.sharedApplication().statusBarFrame.size.height > (myScreenRect.size.height - keyboardHeight)) {

needToMove = (textField.frame.origin.y + textField.frame.size.height + UIApplication.sharedApplication().statusBarFrame.size.height) - (myScreenRect.size.height - keyboardHeight);

}

frame.origin.y = -needToMove

self.view.frame = frame

UIView.commitAnimations()

}

func textFieldDidEndEditing(textField: UITextField) {

// 将文本框向下移动

UIView.beginAnimations( "animateView", context: nil)

var movementDuration:NSTimeInterval = 0.35

var frame : CGRect = self.view.frame

frame.origin.y = 0

self.view.frame = frame

UIView.commitAnimations()

}

注意:在上述代码中,`movementDuration`变量没有被使用到,可以将其注释掉。

如果键盘高度是固定的216,这可能是不准确的。可以参考上面的解决方案,获取实际的键盘高度。

希望对你有帮助,感谢!

0
0 Comments

问题原因:当键盘出现时,UITextField没有自动上移,导致键盘遮挡了UITextField。

解决方法:通过监听键盘的显示和隐藏,调整UITextField的位置,使其上移以避免键盘遮挡。

具体步骤如下:

1. 在UIViewController中设置以下两个函数,在键盘显示/隐藏时调用,并在其代码块中做出相应的响应。

class ViewController: UIViewController, UITextFieldDelegate... {

var frameView: UIView!

}

2. 在viewDidLoad()方法中进行初始化和设置。

override func viewDidLoad() {

self.frameView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height))

// Keyboard stuff.

let center: NotificationCenter = NotificationCenter.default

center.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)

center.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)

}

3. 实现keyboardWillShow和keyboardWillHide两个函数,以响应viewDidLoad()中定义的NotificationCenter函数。下面是一个移动整个视图的示例,但你也可以仅动画化UITextField。

func keyboardWillShow(notification: NSNotification) {

let info:NSDictionary = notification.userInfo! as NSDictionary

let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

let keyboardHeight: CGFloat = keyboardSize.height

let _: CGFloat = info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber as! CGFloat

UIView.animate(withDuration: 0.25, delay: 0.25, options: .curveEaseInOut, animations: {

self.frameView.frame = CGRect(x: 0, y: (self.frameView.frame.origin.y - keyboardHeight), width: self.view.bounds.width, height: self.view.bounds.height)

}, completion: nil)

}

func keyboardWillHide(notification: NSNotification) {

let info: NSDictionary = notification.userInfo! as NSDictionary

let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

let keyboardHeight: CGFloat = keyboardSize.height

let _: CGFloat = info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber as! CGFloat

UIView.animate(withDuration: 0.25, delay: 0.25, options: .curveEaseInOut, animations: {

self.frameView.frame = CGRect(x: 0, y: (self.frameView.frame.origin.y + keyboardHeight), width: self.view.bounds.width, height: self.view.bounds.height)

}, completion: nil)

}

4. 在离开视图时,记得移除通知。

override func viewWillDisappear(_ animated: Bool) {

NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)

NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)

}

注意:frameView是一个UIView,它的尺寸与整个UIViewController相同。你也可以只移动UITextField的位置,而不是整个视图。

如果要移动UITextField的位置,可以在viewDidLoad()中将UITextView放在一个名为textViewWrapperView的UIView中,并在keyboardWillShow和keyboardWillHide中修改textViewWrapperView的位置。

希望以上内容对你有所帮助!

0