In my app I want to be able to place a UIView under my TabBar (to use ad banner). I successfully implemented the UIView, but I can't change the TabBar location (the TabBar to be above the UIView). I try solutions for iOS 13 and early but they don't work on iOS 14. My UIView still is in the foreground over the TabBar.
An example of how I want it to be:
My code now:
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
}
}
You can try ( key is in using viewDidLayoutSubviews
instead of 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
}
}
Omg! It works! You saved my day)) Thank you so much. Can you tell me why it doesn't work in the viewWillLayoutSubviews()?
viewWillLayoutSubviews
is prior toviewDidLayoutSubviews
in call stack you should use the latter where correct frames are calculated and ready for a changePerhaps you tell me how can I return the location of the tabBar while the application is running? For example, I want to hide the banner and for the tabBar to return to its place.