#ios #swift #uikit #uitabbarcontroller #uitabbar
#iOS #swift #uikit #uitabbarcontroller #uitabbar
Вопрос:
В моем приложении я хочу иметь возможность размещать UIView под моей панелью вкладок (для использования рекламного баннера). Я успешно реализовал UIView, но я не могу изменить расположение панели вкладок (панель вкладок должна находиться над UIView). Я пробую решения для iOS 13 и более ранних версий, но они не работают на iOS 14. Мой UIView по-прежнему находится на переднем плане над панелью вкладок.
Пример того, как я хочу, чтобы это было:
Теперь мой код:
class MainTabBarController: UITabBarController {
...
lazy var bannerAd: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .green
return view
}()
...
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(bannerAd)
bannerAd.heightAnchor.constraint(equalToConstant: 44).isActive = true
bannerAd.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
bannerAd.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
}
...
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
var tabFrame = self.tabBar.frame
tabFrame.size.height = tabBarHeight
tabFrame.origin.y = tabFrame.origin.y - 44
self.tabBar.frame = tabFrame
}
}
Ответ №1:
Вы можете попробовать (ключ в использовании viewDidLayoutSubviews
вместо viewWillLayoutSubviews
)
class MainTabBarController: UITabBarController {
lazy var bannerAd: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
view.backgroundColor = .green
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(bannerAd)
bannerAd.heightAnchor.constraint(equalToConstant: 44).isActive = true
bannerAd.leadingAnchor.constraint(equalTo: view.leadingAnchor)
bannerAd.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
bannerAd.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
var tabFrame = self.tabBar.frame
tabFrame.size.height = 44
tabFrame.origin.y = tabFrame.origin.y - 44
self.tabBar.frame = tabFrame
}
}
Комментарии:
1. Боже! Это работает! Ты спас мне день)) Большое вам спасибо. Можете ли вы сказать мне, почему это не работает в viewWillLayoutSubviews()?
2.
viewWillLayoutSubviews
предшествуетviewDidLayoutSubviews
в стеке вызовов, вы должны использовать последний, где вычисляются правильные кадры и готовы к изменению3. Возможно, вы скажете мне, как я могу вернуть местоположение панели вкладок во время работы приложения? Например, я хочу скрыть баннер и вернуть панель вкладок на свое место.