Как скрыть панель навигации при прокрутке вниз, когда ограничения программные?

Я делаю весь свой пользовательский интерфейс программно, чтобы избежать массивного контроллера представления. У меня есть класс типа UIView, где я объявляю все свои элементы пользовательского интерфейса.

Я объявляю свой scrollView следующим образом:

class RegisterUIView: UIView {

    lazy var scrollView: UIScrollView = {
        let scroll: UIScrollView = UIScrollView()
        scroll.contentSize = CGSize(width: self.frame.size.width, height: self.frame.size.height)
        scroll.translatesAutoresizingMaskIntoConstraints = false
        return scroll
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        addSubview(scrollView)
        NSLayoutConstraint.activate([
            scrollView.topAnchor.constraint(equalTo: self.topAnchor),
            scrollView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            scrollView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
            scrollView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
        ])      
   }
}

После декларации. Я создаю экземпляр RegisterUIView в моем ViewController. А в viewWillAppear и viewWillDisappear я использовал переменную hidesBarsOnSwipe, чтобы скрыть панель навигации. Когда я прокручиваю вниз, панель скрывается, но когда я прокручиваю вверх, панель не отображается.

Я прочитал в другом вопросе здесь, что мне нужно установить верхнее ограничение для супервизора. Как можно установить ограничения для супервизора? Когда я пытаюсь установить его, приложение вылетает, и, очевидно, из-за отсутствия супервизора.

class RegisterViewController: UIViewController {

    private let registerView: RegisterUIView = {
        let view: RegisterUIView = RegisterUIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.hidesBarsOnSwipe = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.hidesBarsOnSwipe = false
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        setupLayout()  
    }

    func setupLayout() {
        view.addSubview(registerView)
        NSLayoutConstraint.activate([
            registerView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),
            registerView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),
            registerView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor),
            registerView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor)
        ])
    }


person Robert    schedule 30.06.2020    source источник


Ответы (1)


Добавьте представление прокрутки в подпредставление перед добавлением ограничений. Ваше приложение дает сбой, потому что вы добавляете ограничения к объекту, а не в подпредставлении.

view.addSubview(scrollView)

добавьте эту строку кода в начало вашей функции setupLayout(), прежде чем вы начнете добавлять ограничения.

person hectorsvill    schedule 30.06.2020