2016-11-11 24 views
0

キーボードが画面に表示されたときにsrollviewを動かす際に問題が発生します。 私は画面上に4つのテキストフィールドを持っています。すべては、次の/戻ったキーを持っていないテンキーパッドのテキストフィールドです。そのため、キーボードの前と次のボタンでカスタムツールバーを追加しました。 次のボタンを使ってあるテキストフィールドから別のテキストフィールドに移動すると、カーソルは次のフィールドに正しく移動しますが、スクロールビューは動かずにテキストフィールドがキーボードの後ろに隠れます。ストーリーボードにスクロールビューを追加し、テキストフィールドの代理人も設定しました。キーボードが表示されているときに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カーソルを移動するときに、第2のテキストフィールドに来るが、scrollviewまで移動しないとscrollviewのコンテンツのサイズはまた、キーボードを超えて上に移動しません。

答えて

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 
関連する問題