[英]ScrollView is not automatically moving up when keyboard is visible
當鍵盤出現在屏幕上時,我將滾動視圖向上移動時遇到問題。 我的屏幕上有4個文本字段,並且都是數字小鍵盤文本字段,沒有下一個/完成返回鍵,為此,我在鍵盤上添加了帶有上一個和下一個按鈕的自定義工具欄。 因此,當我使用next按鈕從一個文本字段移動到另一個文本字段時,光標會正確移動到下一個字段,但是scrollview不會向上移動,因此我的文本字段隱藏在鍵盤后面。 我已將滾動視圖添加到我的情節提要中,並設置了文本字段的代表。
碼:
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.registerForKeyboardNotifications()
keyboardVisible = false
}
override open func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.deregisterFromKeyboardNotifications()
}
func registerForKeyboardNotifications ()-> Void {
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWasShown(_:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillBeHidden(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func deregisterFromKeyboardNotifications () -> Void {
let center: NotificationCenter = NotificationCenter.default
center.removeObserver(self, name: NSNotification.Name.UIKeyboardDidShow, object: nil)
center.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWasShown (_ notification: Notification) {
if(keyboardVisible == true){
return
}
print(scrollView)
if let keyboardSize = ((notification as NSNotification).userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
offset = scrollView!.contentOffset
print(offset)
var viewFrame = scrollView!.frame
viewFrame.size.height -= keyboardSize.height
scrollView!.frame = viewFrame
var textFieldRect = activeField?.frame
textFieldRect?.origin.y += 10;
scrollView!.scrollRectToVisible(textFieldRect!, animated: true)
keyboardVisible = true;
}
}
func keyboardWillBeHidden (_ notification: Notification) {
if(keyboardVisible == false){
return;
}
scrollView.frame = CGRect(x: 0, y: 0, width: scrollViewWidth, height: scrollViewHeight)
scrollView?.contentOffset = offset
keyboardVisible = false
}
// textfield delegate
//in textfieldDidBeginEditing i m setting custom toolbar on textfield input accesory view
open func textFieldDidBeginEditing(_ textField: UITextField) {
if(textField == myTextField1){
myTextField1.inputAccessoryView = myCustomToolbar
myCustomToolbar?.nextButton.isEnabled = true
myCustomToolbar?.previousButton.isEnabled = false
myCustomToolbar?.nextButton.title = "Next"
}else if(textField == myTextField2){
myTextField2.inputAccessoryView = myCustomToolbar
myCustomToolbar?.previousButton.isEnabled = true
myCustomToolbar?.nextButton.isEnabled = true
myCustomToolbar?.nextButton.title = "Next"
}else if(textField == myTextField3){
myTextField3.inputAccessoryView = myCustomToolbar
myCustomToolbar?.nextButton.isEnabled = true
myCustomToolbar?.previousButton.isEnabled = true
myCustomToolbar?.nextButton.title = "Next"
}else if(textField == myTextField4){
myTextField4.inputAccessoryView = myCustomToolbar
myCustomToolbar?.nextButton.isEnabled = true
myCustomToolbar?.previousButton.isEnabled = true
myCustomToolbar?.changeNextToActionButton(withTitle: "Some title")
}
}
open func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
activeField = textField
return true
}
//PnPToolbar Delegate
public func pnPToolbarNextButtonClicked(_ myCustomToolbar: myCustomToolbar!) {
if(myTextField1.isFirstResponder){
myTextField2.becomeFirstResponder()
}else if(myTextField2.isFirstResponder){
myTextField3.becomeFirstResponder()
}else if(myTextField3.isFirstResponder){
myTextField4.becomeFirstResponder()
}else if(ifscCode.isFirstResponder){
//Done call your method
self.myMethod()
}
var textFieldRect = activeField?.frame
textFieldRect?.origin.y += 10;
scrollView!.scrollRectToVisible(textFieldRect!, animated: true)
}
public func myCustomToolbarPreviousButtonClicked(_ myCustomToolbar: myCustomToolbar!) {
if(myTextField4.isFirstResponder){
myTextField3.becomeFirstResponder()
}else if(myTextField3.isFirstResponder){
myTextField2.becomeFirstResponder()
}else if(myTextField2.isFirstResponder){
myTextField1.becomeFirstResponder()
}
var textFieldRect = activeField?.frame
textFieldRect?.origin.y += 10;
scrollView!.scrollRectToVisible(textFieldRect!, animated: true)
}
當我從myTextField1移動到myTextField2時,光標移至第二個文本字段,但scrollview不會向上移動,scrollview的內容大小也不會向上移動超出鍵盤。
在TextField的委托中管理您的標志,如下所示:
func textFieldDidBeginEditing(_ textField: UITextField) {
keyboardVisible = true
}
func textFieldEndEditings(sender:UITextField) -> Void {
print(sender.text)
keyboardVisible = false
}
對於鍵盤上方的工具欄
let numberToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.size.width, 50))
numberToolbar.barStyle = UIBarStyle.Default
numberToolbar.items = [
UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancelNumberPad"),
UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil),
UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "doneWithNumberPad")]
numberToolbar.sizeToFit()
phonenumberTextField.inputAccessoryView = numberToolbar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.