2016-11-11 6 views
0

У меня возникла проблема с перемещением моего srollview вверх, когда на экране появляется клавиатура. У меня есть 4 текстовых поля на моем экране, и все это текстовые поля с числовой клавиатурой, у которых нет следующего/завершенного ключа возврата, поэтому я добавил пользовательскую панель инструментов с предыдущей и следующей кнопками на моей клавиатуре. Итак, когда я перехожу из одного текстового поля в другое текстовое поле, используя следующую кнопку, курсор перемещается правильно в следующее поле, но scrollview не перемещается, поэтому текстовое поле скрывается за клавиатурой. Я добавил scrollview в свою раскадровку и установил делегаты текстового поля.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 также не перемещается вверх за пределы клавиатуры.

ответ

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 

 Смежные вопросы

  • Нет связанных вопросов^_^