Developing Tab Bar Navigation for iOS App
UITabBarController — system component Apple recommends for apps with 2–5 equal sections. Looks simple, but nuances appear immediately when custom appearance needed, dynamic badge counter, or specific behavior on active tab re-tap.
Typical complications
Custom appearance. Since iOS 15 Apple changed tab bar customization system — UITabBar.appearance() stopped working for some parameters. Now correct path: UITabBarAppearance + UITabBarItemAppearance. Without this, iOS 15+ tab bar gets white or grey background instead custom, app looks broken.
let appearance = UITabBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = .systemBackground
tabBar.standardAppearance = appearance
tabBar.scrollEdgeAppearance = appearance
Badge. tabBarItem.badgeValue = "3" works out of box, but red circle system. Custom badge with different color or shape — via badgeColor (iOS 10+) or fully custom overlay view over tab icon.
Re-tap on active tab. Standard behavior — nothing. User expectation — scroll to top in list. Implemented via UITabBarControllerDelegate.tabBarController(_:didSelect:): if selected viewController — this UINavigationController, get its topViewController, find UIScrollView (or UITableView, UICollectionView), call setContentOffset(.zero, animated: true).
SwiftUI
In SwiftUI use TabView with .tabItem modifier. Since iOS 18 Apple updated TabView — new Tab type and sidebar-support for iPad appeared. For complex customization in SwiftUI before iOS 18 often simpler wrap UITabBarController via UIViewControllerRepresentable.
What's included in work
- Setup
UITabBarControllerorTabViewwith needed tabs count - Custom appearance via
UITabBarAppearance - Badge counters with updates from notifications service
- Scroll to top on active tab re-tap
- iPad adaptation (optional: split view instead of tab bar)
Timeframe
Basic implementation with custom design: 1 day. With badge logic, custom animations and iPad adaptation — 2–3 days. Cost calculated individually.







