UITabBar с безопасной областью внутри программно созданного UIViewController - PullRequest
0 голосов
/ 17 мая 2018

Прежде чем пометить его как дубликат, обратите внимание, что я прочитал это , и, похоже, это не относится к UITabBar

И UIViewController, и UITabBar созданы программно. Ограничения устанавливаются так:

public override func viewDidLoad() {
    super.viewDidLoad()
    self.view.bringSubview(toFront: self.tabBar)
}

И self.tabBar:

lazy var tabBar: UITabBar = {
    let tab = UITabBar()
    self.view.addSubview(tab)
    tab.translatesAutoresizingMaskIntoConstraints = false
    tab.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
    tab.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
    tab.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true //This line will change in second part of this post.
    return tab
}()

А это шоу UITabBar вот так:

enter image description here

И это слишком мало, потому что не учитывает безопасные районы. Поэтому я изменил строку:

tab.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true

до:

tab.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true

И тогда это выглядит так:

enter image description here

Так что это также не отображается, как ожидалось. Цель здесь вот так:

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Здесь я сделал это:

let tabBar = UITabBar()

override func viewDidLoad() {
    super.viewDidLoad()
    addTabbar()
}
override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    addHeightConstraintToTabbar()
}

func addTabbar() -> Void {
    self.view.addSubview(tabBar)
    tabBar.translatesAutoresizingMaskIntoConstraints = false
    tabBar.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
    tabBar.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
    tabBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    let item1 = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.bookmarks, tag: 1)
    let item2 = UITabBarItem(tabBarSystemItem: UITabBarSystemItem.contacts, tag: 2)

    tabBar.items = [item1, item2]
    self.view.bringSubview(toFront: tabBar)
}

func addHeightConstraintToTabbar() -> Void {
    let heightConstant:CGFloat = self.view.safeAreaInsets.bottom + 49.0
    tabBar.heightAnchor.constraint(equalToConstant: heightConstant).isActive = true
}

Результат:

enter image description here


Может не знать, верно лиделать таким образом.Вы должны сделать это лучше.

0 голосов
/ 17 мая 2018

Когда вы добавляете UItabbar в UIViewController и используете safeAreaLayoutGuide или layoutMarginsGuide, оно будет добавлено для сохранения области этого контроллера вида, имеющего SafeAreaInsets с пробелом внизу, вы можете изменить, но если вы добавите в Viewиз UIViewController он будет придерживаться края без пробелов, с высотой по умолчанию 49

, чтобы увеличить эту высоту, добавьте heightAnchor ограничение

  lazy var tabBar: UITabBar = {
        let tab = UITabBar()
        self.view.addSubview(tab)
        tab.translatesAutoresizingMaskIntoConstraints = false
        tab.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        tab.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
        tab.heightAnchor.constraint(equalToConstant: 80).isActive = true
        tab.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true //This line will change in second part of this post.
        return tab
    }()

, чтобы использовать безопасную область, направляя васможет добавить отрицательное значение к основанию additionalSafeAreaInsets ViewController

self.additionalSafeAreaInsets = UIEdgeInsetsMake(0, 0, -39, 0)
...