Swift AutoLayout - якоря не применяются программно - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над приложением без использования storyboards. У меня есть navBar внутри StackView. Я установил ярлыки под ним, которые хорошо вписываются. Но у меня проблема в том, что ограничения, которые я установил на labels, не применяются. Я потратил много времени на это, но я не знаю, почему ошибка и как ее отладить.

image screenshot

class SellBaseViewController: UIViewController {

    lazy var container: UIStackView = {
        let stackView = UIStackView(frame: .zero)
        stackView.alignment = .fill
        stackView.axis = .vertical
        stackView.spacing = 2
        stackView.willSetConstraints()
        return stackView
    }()

    lazy var navHeader: UIView! = {
        return self.navBar()
    }()

    lazy var firstLabel: UILabel! = {
        return self.labelOne()
    }()

    lazy var secondLabel: UILabel! = {
        return self.labelTwo()
    }()
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        if !Authentication.shared.isAuthenticated {
            showLogin()
        } else {
            self.setupInterface()
        }
    }

    private func setupInterface() {
        self.navigationController?.navigationBar.isHidden = true
        self.embedInScrollView(content: self.container)
        navHeader.willSetConstraints()
        firstLabel.willSetConstraints()
        secondLabel.willSetConstraints()
        self.container.addArrangedSubviews([self.navHeader!, self.firstLabel!, self.secondLabel!])
        DispatchQueue.main.async {

            NSLayoutConstraint.activate([
                self.navHeader.heightAnchor.constraint(equalToConstant: 44),
                self.navHeader.widthAnchor.constraint(equalTo: self.view.widthAnchor),
                self.navHeader.topAnchor.constraint(equalTo: self.container.topAnchor),
            //constraints not getting applied.
                self.firstLabel.topAnchor.constraint(equalTo: self.navHeader.bottomAnchor, constant: 70),
                 self.firstLabel.leftAnchor.constraint(equalTo: self.navHeader.leftAnchor, constant: 70),

 self.secondLabel.topAnchor.constraint(equalTo: self.firstLabel.bottomAnchor, constant: 70),
                self.secondLabel.leftAnchor.constraint(equalTo: self.firstLabel.leftAnchor, constant: 70),
                ])
        }
    }


    // MARK: NAVBAR
    func navBar() -> UIView {
        let navBar = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: self.view.frame.width, height: 44)))
        navBar.backgroundColor = UIColor.constants.darkBlue
        let backIcon = UIImage(named: "ic_back")?.withRenderingMode(.alwaysTemplate)
        let returnButton = UIButton(type: .custom)
        returnButton.imageView?.tintColor = UIColor.white
        returnButton.setImage(backIcon, for: .normal)
        returnButton.image(for: .normal)
        returnButton.titleLabel?.font = UIFont(name: "Hind", size: 18)
        returnButton.setTitle("Sell", for: .normal)
        returnButton.setTitleColor(UIColor.white, for: .normal)
        returnButton.addTarget(self, action: #selector(self._return), for: .touchUpInside)
        returnButton.willSetConstraints()

        navBar.addSubviews([returnButton])
        NSLayoutConstraint.activate([
            returnButton.centerYAnchor.constraint(equalTo: navBar.centerYAnchor),
            returnButton.leadingAnchor.constraint(equalTo: navBar.leadingAnchor, constant: 11),
            returnButton.heightAnchor.constraint(equalToConstant: 24),
            returnButton.widthAnchor.constraint(equalToConstant: 71),
            ])
        return navBar
    }
    func labelOne() -> UILabel{
        let label = UILabel()
        label.textAlignment = .center
        label.textColor = .black
        label.font = UIFont(name: "RobotoBold", size: 23.5)?.bold
        label.text = "What do you want to sell?"
        self.view.addSubview(label)
        return label
    }
    func labelTwo() -> UILabel{
        let label = UILabel()
        label.textAlignment = .center
        label.textColor = .black
        label.font = UIFont(name: "Avenir-Light", size: 14.5)
        label.text = "We'll fit your photo for better viewing experience."
        self.view.addSubview(label)
        return label
    }
    @objc func _return() {
        self.backHome()
    }

}

expected outcome

...