Last active
October 10, 2024 07:06
-
-
Save calt/7ea29a65b440c2aa8a1a to your computer and use it in GitHub Desktop.
UITabBar with custom height in Swift, does not work for iOS 14 or later.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Does not work on iOS 14.0 or later, keeping the gist just for reference. | |
extension UITabBar { | |
override open func sizeThatFits(size: CGSize) -> CGSize { | |
super.sizeThatFits(size) | |
var sizeThatFits = super.sizeThatFits(size) | |
sizeThatFits.height = 71 | |
return sizeThatFits | |
} | |
} |
New to Swift over here! - Trying to understand how I would use this in Views. Here is my Tabs View `struct Tabs: View {
@EnvironmentObject private var themeManager: ThemeManager
@Environment(.colorScheme) var mode: ColorScheme
@State private var selectedTab = 0
var body: some View {
TabView(selection: $selectedTab) {
DetailsView()
.tabItem {
Text("Home")
TabImage(name: "misty", size: CGSize(width: 42, height: 42))
}
.tag(0)
SettingsView()
.tabItem {
Text("Socials")
TabImage(name: "laptop", size: CGSize(width: 42, height: 42))
}
.tag(1)
}
.onAppear(perform: {
CustomTabBar().sizeThatFits(CGSize(width: 300, height: 400))
})
.accentColor(AppColors(mode: mode).jnjBorder)
}
}`
With the extension class CustomTabBar : UITabBar { override open func sizeThatFits(_ size: CGSize) -> CGSize { super.sizeThatFits(size) var sizeThatFits = super.sizeThatFits(size) sizeThatFits.height = 71 return sizeThatFits } }
However my emulator is still showing all clumped up. I've tried a few other ways to try and increase the height but nothing seems to work!
After testing many ways, this one works best for me:
final class CustomTabBar: UITabBar {
private let topLineLayer: CALayer = {
let obj = CALayer()
obj.backgroundColor = UIColor.appBorder.cgColor
return obj
}()
private let tabBarAppearance: UITabBarAppearance = {
let obj = UITabBarAppearance()
obj.stackedLayoutAppearance.normal.titleTextAttributes = [
.font: UIFont.interFont(ofSize: 12.sizeW, weight: .medium),
]
return obj
}()
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
topLineLayer.frame.size = CGSize(width: bounds.width, height: 1)
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = 64 + safeAreaInsets.bottom // 64 is custom height
return sizeThatFits
}
}
// MARK: - Setup
extension CustomTabBar {
private func setup() {
standardAppearance = tabBarAppearance
tintColor = .appLabel
unselectedItemTintColor = .appStroke
layer.addSublayer(topLineLayer)
}
}
final class CustomTabBarController: UITabBarController {
private let customTabBar = CustomTabBar()
override func loadView() {
super.loadView()
setValue(customTabBar, forKey: "tabBar")
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@Wei18 thank you! still working for swift 5+