UITabBar с безопасной областью внутри программно созданного UIViewController

Прежде чем пометить его как дубликат, обратите внимание, что я прочитал это и похоже, это не относится к 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 выглядит так:

введите описание изображения здесь

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

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

to:

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

И тогда это показано так:

введите описание изображения здесь

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

введите описание изображения здесь

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


person Jakub    schedule 17.05.2018    source источник
comment
Почему вы сами добавляете панель вкладок? лучше использовать UITabBarController   -  person Scriptable    schedule 17.05.2018
comment
Мне не нужно UITabBarController. Что не так с добавлением UITabBar?   -  person Jakub    schedule 17.05.2018
comment
UITabBarController делает за вас большую часть работы.   -  person Scriptable    schedule 17.05.2018
comment
Я знаком с UITabBarController и UITabBar, мне просто не нужны большинство функций UITabBarController. В UITabBar нет ничего плохого. В документах Apple: Typically, you use tab bars in conjunction with a UITabBarController object, but you can also use them as standalone controls in your app.   -  person Jakub    schedule 17.05.2018
comment
Я знаю, что вы можете использовать его отдельно, я просто задал вопрос, для уточнения   -  person Scriptable    schedule 17.05.2018
comment
Вам это нужно только программно? Я установил его с помощью конструктора интерфейсов.   -  person Krunal    schedule 17.05.2018
comment
Конечно, вы можете просто установить ограничение высоты, скажем, 100, на панель вкладок, и это должно исправить это? Однако вам придется дважды проверить, что это iPhone X.   -  person Pranav Kasetti    schedule 17.05.2018
comment
Да, к сожалению, я не могу использовать раскадровку для этого случая :/   -  person Jakub    schedule 17.05.2018


Ответы (3)


Вот я сделал это:

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
}

Результат:

введите описание изображения здесь


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

person Krunal    schedule 17.05.2018
comment
@PranavKasetti Вы можете увидеть результат для обоих устройств (iPhone-X и других, кроме iPhoneX (iPhone SE)) в ответе. Пожалуйста, объясните вашу озабоченность более подробно. Мы приветствуем вас, чтобы улучшить качество этого ответа, добавив сюда свой вклад. - person Krunal; 17.05.2018

Когда вы добавляете UItabbar в UIViewController и используете safeAreaLayoutGuide или layoutMarginsGuide, он будет добавлен для сохранения области этого контроллера представления, у которого есть SafeAreaInsets с пробелом внизу, который вы можете изменить, но если вы добавите в представление 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)
person Abdelahad Darwish    schedule 17.05.2018

Нижний якорь должен быть подключен к представлению safeAreaLayoutGuide.

tabbar.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    tabbar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
    tabbar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
    tabbar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
person Divyesh Makwana    schedule 04.06.2021