如何在 iOS 14 中更改 TabBar 位置
How to change a TabBar location in iOS 14
在我的应用程序中,我希望能够在我的 TabBar 下放置一个 UIView(以使用广告横幅)。我成功实现了 UIView,但我无法更改 TabBar 位置(TabBar 位于 UIView 上方)。我尝试了 iOS 13 和早期的解决方案,但它们不适用于 iOS 14。我的 UIView 仍然在 TabBar 的前景中。
我希望它成为的示例:
我现在的代码:
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
}
}
你可以试试(关键是使用 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
}
}
在我的应用程序中,我希望能够在我的 TabBar 下放置一个 UIView(以使用广告横幅)。我成功实现了 UIView,但我无法更改 TabBar 位置(TabBar 位于 UIView 上方)。我尝试了 iOS 13 和早期的解决方案,但它们不适用于 iOS 14。我的 UIView 仍然在 TabBar 的前景中。
我希望它成为的示例:
我现在的代码:
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
}
}
你可以试试(关键是使用 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
}
}