Search code examples
swiftsafearealayoutguide

Swift Safe Area Layout not activating properly


I am learning some auto layout programatically and I want to add a button on the bottom part of the screen, just above the safe area.

I know the code is working, because I tested it in another project, I think it is a conflict because I get to this viewController from another one.

The code for my button

   private let previousButton : UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Prev", for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

The code for setting up my constraints

    fileprivate func setupBottomControls() {
        view.addSubview(previousButton)
        previousButton.backgroundColor = .red
        view.addSubview(previousButton)
 NSLayoutConstraint.activate([
            previousButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            previousButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            previousButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            previousButton.heightAnchor.constraint(equalToConstant: 50)
            ])
    }

Like I said this code is working in another project but I think it is in conflict because of how I called this viewController. This is a code from the first view controller that make the new viewController(GettingStartedController) to be shown, here it will be the button mentioned above.

    func switchVC(){
        //enter GettingStarted controller
        let controller = GettingStartedController()
        view.addSubview(controller.view)
        present(UINavigationController(rootViewController: controller), animated: true,completion: nil) //used when no animation is present
    }

I think the problem is here any ideas on how to change the call to the GettingStartedController so that will see the Safe Area the right way?


Solution

  • Check my code solution. I added your function to the button when it is tapped and it now presents the GettingStartedController():

    private let previousButton : UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Prev", for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(switchVC), for: .touchUpInside)
        return button
    }()
    
    fileprivate func setupBottomControls() {
        view.addSubview(previousButton)
        previousButton.backgroundColor = .red
        view.addSubview(previousButton)
        NSLayoutConstraint.activate([
            previousButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            previousButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            previousButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            previousButton.heightAnchor.constraint(equalToConstant: 50)
            ])
    }
    
    @objc func switchVC(){
        //enter GettingStarted controller
        let controller = GettingStartedController()
        present(UINavigationController(rootViewController: controller), animated: true,completion: nil) //used when no animation is present
    }
    

    enter image description here