2016-11-11 85 views
0

当键盘出现在屏幕上时,我正在向上移动srollview时出现问题。 我有4个textfields在我的屏幕上,所有数字键盘textfields没有下一个/完成返回键,所以我已添加自定义工具栏与上一个和下一个按钮在我的键盘上。 所以,当我从一个文本字段移动到另一个文本字段使用下一个按钮时,光标正确移动到下一个字段,但滚动视图不会向上移动,所以我的文本字段隐藏在键盘后面。我已将scrollview添加到了我的故事板,并设置了textfield的代表。当键盘可见时,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光标谈到第二文本框,但滚动型不动起来,滚动视图的内容大小也无法超越键盘向上移动。

回答

0

管理您在TextField中的代表标志如下:

func textFieldDidBeginEditing(_ textField: UITextField) { 
     keyboardVisible = true 
    } 

    func textFieldEndEditings(sender:UITextField) -> Void { 
     print(sender.text) 
     keyboardVisible = false 
    } 
0

工具栏键盘上方

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