Uiscrollview rolling when displays keyboard - Swift

Asked

Viewed 88 times

0

Hello I am using a Uiview with a Uiscrollview to assemble a layout, but every time the keyboard is shown the scrollview and scrolled down, I have tried some solutions, found here and in other forums no more solved my problem, Note: I am creating the layout programmatically

follows my code for analysis :

import UIKit

class ExempleUIViewController: UIViewController, UIScrollViewDelegate, InputTextViewDelegate, SwitchViewDelegate {

  func performSwitch(cell: UIView, value: Bool) { // retorna valores do campo se alterado

  }

  func performInputTextView(cell: UIView, value: Any ? ) { // retorna valores do campo se alterado

  }

  //Campos customizados

  var descriptionView = DescriptionView()

  var inputTextView = InputTextView()

  var inputTextLongView = InputTextLongView()

  var disclousureView = DisclousureView()

  var switchView = SwitchView()

  var inputDateView = InputDateView()

  var inputTextPickerView = InputTextPickerView()

  //UiscrollView

  let scrollView: UIScrollView = {
    let v = UIScrollView()
    v.translatesAutoresizingMaIntoConstraints = false
    v.alwaysBounceVertical = true
    v.showsHorizontalScrollIndicator = false
    v.backgroundColor = UIColor.white
    return v
  }()

  //Variavel para controlle da altura da UIScrollView

  var scrollHeigth = 1000

  //Trava a UIScrollView na horizontal

  func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x != 0 {
      scrollView.contentOffset.x = 0
    }
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    self.automaticallyAdjustsScrollViewInsets = false

    title = "ScrollView"

    scrollView.delegate = self

    //adiciona a Scrollview na view

    self.view.addSubview(scrollView)

    scrollView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    scrollView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true

    //seta as views dos campos
    setupViews()

    //Dispara evento quando o teclado e aparece e desaparece para reajustar posicao do scrollview
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

  }

  //tenta tratar o bug que ocorre quando o teclado e mostrado nao funciona

  @objc func keyboardWillShow(notification: NSNotification) {

    var userInfo = notification.userInfo!
      var keyboardFrame: CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as!NSValue).cgRectValue
    keyboardFrame = self.view.convert(keyboardFrame, from: nil)
    var contentInset: UIEdgeInsets = self.scrollView.contentInset
    contentInset.bottom = (keyboardFrame.size.height + 40)
    scrollView.contentInset = contentInset
  }

  @objc func keyboardWillHide(notification: NSNotification) {

    let contentInset: UIEdgeInsets = UIEdgeInsets.zero
    scrollView.contentInset = contentInset
  }

  //adiciona as views na scrollview programaticamente
  func setupViews() {
    descriptionView.titleLabel.text = "Description"

    scrollView.addSubview(descriptionView)
    descriptionView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 16).isActive = true
    descriptionView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    descriptionView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    inputTextView.titleLabel.text = "Input Text"
    inputTextView.textField.placeholder = "Test123"
    inputTextView.delegate = self

    scrollView.addSubview(inputTextView)
    inputTextView.topAnchor.constraint(equalTo: descriptionView.bottomAnchor).isActive = true
    inputTextView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    inputTextView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    inputTextLongView.placeHolder = "TextLongView"
    inputTextLongView.delegate = self

    scrollView.addSubview(inputTextLongView)
    inputTextLongView.topAnchor.constraint(equalTo: inputTextView.bottomAnchor).isActive = true
    inputTextLongView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    inputTextLongView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    disclousureView.titleLabel.text = "DiclousureText"
    disclousureView.subTitleLabel.text = "DiclousureSelect"

    scrollView.addSubview(disclousureView)
    disclousureView.topAnchor.constraint(equalTo: inputTextLongView.bottomAnchor).isActive = true
    disclousureView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    disclousureView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    switchView.titleLabel.text = "SwitchTitle"
    switchView.delegate = self

    scrollView.addSubview(switchView)
    switchView.topAnchor.constraint(equalTo: disclousureView.bottomAnchor).isActive = true
    switchView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    switchView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    inputDateView.titleLabel.text = "Date"
    inputDateView.delegate = self
    inputDateView.textField.dateFormatter.locale = Locale(identifier: "pt-br")
    inputDateView.textField.dateFormatter.dateFormat = "dd/MM/YYYY"
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "pt-br")
    dateFormatter.dateFormat = "dd/MM/yyyy"
    var dateAux = dateFormatter.string(from: Date())
    let date = dateFormatter.date(from: dateAux)
    inputDateView.setDate(date!)

    scrollView.addSubview(inputDateView)
    inputDateView.topAnchor.constraint(equalTo: switchView.bottomAnchor).isActive = true
    inputDateView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    inputDateView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true

    inputTextPickerView.titleLabel.text = "SwitchTitle"
    inputTextPickerView.delegate = self
    inputTextPickerView.strings = ["Teste1", "Teste2", "Teste3", "Teste4", "Teste5"]
    inputTextPickerView.keys = ["0", "1", "2", "3", "4"]

    scrollView.addSubview(inputTextPickerView)
    inputTextPickerView.topAnchor.constraint(equalTo: inputDateView.bottomAnchor).isActive = true
    inputTextPickerView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    inputTextPickerView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true
  }

  //seta tamanha na scrollview

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width
    scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: CGFloat(scrollHeigth), right: screenWidth)
    scrollView.contentSize = CGSize(width: screenWidth, height: CGFloat(scrollHeigth))
  }
}

  • I found a solution apparently just set the last view bottomAnchor in the scrollview bottomAnchor and use the solution I’m already using to adjust the scrollview position according to the selected textfield

1 answer

3

I resolvo this problem using Iqkeyboardmanager Very quiet to use and you will not have these problems.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.