Установка значения UITextField heightAnchor в 0 не работает в iOS 15

#ios #uitextfield #ios15

Вопрос:

У меня есть приложение iOS, в котором у меня есть текстовое поле и кнопка, и при нажатии кнопки я должен скрыть текстовое поле.

Я устанавливаю значение heightAnchor на 0 при нажатии кнопки. Все работает нормально в iOS 14(14.5), но не работает(не скрывает текстовое поле) в iOS 15. Кроме того, я попытался настроить свойство isHidden в поле UITextField, но это не работает.

Не могли бы вы, пожалуйста, помочь сказать, изменилось ли что-то или я делаю что-то не так. Спасибо.

Ссылка на код:

 import UIKit

class ViewController: UIViewController {

  private lazy var mytextFeild: UITextField = {
    let textField = UITextField()
    textField.translatesAutoresizingMaskIntoConstraints = false
    textField.text = "Hello world"
    textField.backgroundColor = .green
    return textField
  }()
   
  private lazy var testView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .systemPink
    return view
  }()
   
  private lazy var button: UIButton = {
    let view = UIButton()
    view.backgroundColor = .blue
    view.setTitle("hide it", for: .normal)
    view.translatesAutoresizingMaskIntoConstraints = false
     
    view.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    return view
  }()
   
  var heightConstraint: NSLayoutConstraint?
   
  @objc func buttonTapped() {
    heightConstraint?.isActive = false
    heightConstraint = mytextFeild.heightAnchor.constraint(equalToConstant: 0)
    heightConstraint?.isActive = true
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(mytextFeild)
    view.addSubview(testView)
    view.addSubview(button)
     
    mytextFeild.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32).isActive = true
    mytextFeild.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32.0).isActive = true
    mytextFeild.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true
    heightConstraint = mytextFeild.heightAnchor.constraint(equalToConstant: 32.0)
    heightConstraint?.isActive = true
    button.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32.0).isActive = true
    button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32.0).isActive = true
    button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
    button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -64.0).isActive = true
     
    testView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    testView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    testView.topAnchor.constraint(equalTo: mytextFeild.bottomAnchor).isActive = true
    testView.bottomAnchor.constraint(equalTo: button.topAnchor).isActive = true
  }
}
 

введите описание изображения здесь

Ответ №1:

Добавьте их в стек, а затем добавьте стек в ViewController. в конце попробуйте легко скрыть его, не меняя высоту.

 class ViewController: UIViewController {

    private lazy var stackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .fill
        stackView.alignment = .center
        stackView.translatesAutoresizingMaskIntoConstraints = false
        return stackView
    }()
    
    private lazy var myTextField: UITextField = {
        let textField = UITextField()
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.text = "Hello world"
        textField.backgroundColor = .green
        return textField
    }()
    
    private lazy var testView: UIView = {
        let view = UIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .systemPink
        return view
    }()
    
    private lazy var button: UIButton = {
        let view = UIButton()
        view.backgroundColor = .blue
        view.setTitle("hide it", for: .normal)
        view.translatesAutoresizingMaskIntoConstraints = false
        
        view.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        return view
    }()

    @objc func buttonTapped() {
        myTextField.isHidden = !myTextField.isHidden
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white
        
        stackView.addArrangedSubview(myTextField)
        stackView.addArrangedSubview(testView)
        stackView.addArrangedSubview(button)
        view.addSubview(stackView)
        
        stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -64.0).isActive = true
        stackView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        stackView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true

        myTextField.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
        myTextField.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -64.0).isActive = true

        testView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        
        button.heightAnchor.constraint(equalToConstant: 32.0).isActive = true
        button.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -64.0).isActive = true
    }
}
 

Комментарии:

1. Привет @Mahshid, не могли бы вы добавить какой-нибудь закодированный пример о том, как этого добиться?

2. @Walucas Обновлено!