Расположение кнопки с панелью вкладок - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь расположить кнопку, но обнаружил проблему с ней.

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

 self.tabBarController?.tabBar.isHidden = false
 loadButton()

Когда представление действительно появилось, метод

 override func viewDidAppear(_ animated: Bool) {
            if shouldReloadDataOnViewWillAppear {
                // your code for reloading data
                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2){
                    self.scaleDownAnimation()
                }
                shouldReloadDataOnViewWillAppear = false

            }
        }

///// Затем я вызываю еще несколько функций для настройки карты и маркеров.

Последняя строка Функция устанавливает панель вкладок для скрытия:

self.tabBarController?.tabBar.isHidden = false

, затем я вызываю функцию кнопки загрузки

func loadButton()
    {
        if  self.tabBarController?.tabBar.isHidden == false{
        button.setBackgroundImage(UIImage(named:"compass.png"), for: .normal)
        button.addTarget(self, action: #selector(btnPressed), for: UIControl.Event.touchUpInside)

        self.view.addSubview(button)

        button.translatesAutoresizingMaskIntoConstraints = false
        let widthContraints =  NSLayoutConstraint(item: button, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 40)

        let heightContraints = NSLayoutConstraint(item: button, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 40)

        let xContraints = NSLayoutConstraint(item: button, attribute: NSLayoutConstraint.Attribute.bottomMargin, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.bottomMargin, multiplier: 1, constant: -40)

        let yContraints = NSLayoutConstraint(item: button, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: -40)

        NSLayoutConstraint.activate([heightContraints,widthContraints,xContraints,yContraints])
        }
    }

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

Надеюсь, это действительно простая задача, которую нужно решить!

Ответы [ 4 ]

1 голос
/ 07 марта 2020

Здесь вы можете проверить это!

Протестировано и все заработало!

в viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()        

    //setupViews() after setting up all your Views

    loadButton()
}

В loadButton()

fileprivate func loadButton() {

    if  self.tabBarController?.tabBar.isHidden == false {
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setImage(UIImage(asset: Asset.Assets.CommonIcons.closeButton), for: .normal) // setup you own Image 
        button.backgroundColor = UIColor.gray // setup you own colour if needed
        button.layer.cornerRadius = 20 // add if needed
        //button.addTarget(self, action: #selector(btnPressed), for: UIControl.Event.touchUpInside)
        self.view.addSubview(button)

        NSLayoutConstraint.activate([

            button.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -40),
            button.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -40),
            button.heightAnchor.constraint(equalToConstant: 40),
            button.widthAnchor.constraint(equalToConstant: 40)
        ])
    }
}

Здесь вывод

enter image description here

Обновлено:

Можете ли вы добавить точку останова к этой строке

        NSLayoutConstraint.activate([
            // =========> Add a breakpoint here 
            button.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -40),
            button.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -40),
            button.heightAnchor.constraint(equalToConstant: 40),
            button.widthAnchor.constraint(equalToConstant: 40)
        ])

Затем запустите приложение, Теперь вы можете узнать, вызывается ли метод перед настройкой your setupViews!

Или просто внесите некоторые изменения в код следующим образом

Это может работать!

Установите ограничения для кнопки отдельным методом, как показано ниже

func updateButtonConstraints() {

    NSLayoutConstraint.activate([

        button.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, constant: -40),
        button.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -40),
        button.heightAnchor.constraint(equalToConstant: 40),
        button.widthAnchor.constraint(equalToConstant: 40)
    ])
}

Затем вызовите updateButtonConstraints() в loadButton()

fileprivate func loadButton() {

        if  self.tabBarController?.tabBar.isHidden == false {
            button.translatesAutoresizingMaskIntoConstraints = false
            button.setImage(UIImage(asset: Asset.Assets.CommonIcons.closeButton), for: .normal) // setup you own Image 
            button.backgroundColor = UIColor.gray // setup you own colour if needed
            button.layer.cornerRadius = 20 // add if needed
            //button.addTarget(self, action: #selector(btnPressed), for: UIControl.Event.touchUpInside)
            self.view.addSubview(button)

            updateButtonConstraints()
        }
    }

, затем дополнительно добавьте метод в

override func viewDidLayoutSubviews() {
    updateButtonConstraints()
}

Можете ли вы проверить, работает ли он сейчас?

1 голос
/ 06 марта 2020
    if tabBarController?.tabBar.isHidden == false {
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setBackgroundImage(UIImage(named:"compass.png"), for: .normal)
        button.addTarget(self, action: #selector(btnPressed), for: UIControl.Event.touchUpInside)

        view.addSubview(button)
        NSLayoutConstraint.activate([
            button.widthAnchor.constraint(equalToConstant: 40),
            button.heightAnchor.constraint(equalToConstant: 40),
            button.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -40),
            button.bottomAnchor.constraint(equalTo: bottomLayoutGuide.bottomAnchor, constant: -40)
        ])
    }
1 голос
/ 06 марта 2020

Используйте safeAreaLayoutGuide. bottomLayoutGuide устарел:

override func loadView() {
    super.loadView()

    view.addSubview(button)
    button.translatesAutoresizingMaskIntoConstraints = false        
    NSLayoutConstraint.activate([
        button.widthAnchor.constraint(equalToConstant: 40),
        button.heightAnchor.constraint(equalToConstant: 40),
        button.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -40),
        button.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -40)
    ])
}
1 голос
/ 17 февраля 2020

Вам было бы проще рассуждать о своих ограничениях, если вы использовали NSLayoutAnchor вместо того, чтобы вручную создавать ограничения:

NSLayoutContstraint.activate(
  [
    button.widthAnchor.constraint(equalTo: 40),
    button.heightAnchor.constraint(equalTo: 40),
    button.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -40),
    button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -40)
  ]
)

Это удаляет целую кучу шума из вашего кода, чтобы вы могли больше легко увидеть логи c вместо стены текста с объявлениями об ограничениях.

Что касается вашей проблемы, вам, вероятно, следует использовать безопасную область представления вместо самого представления:

button.bottomAnchor.constraint(
  equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -40
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...