Вступление
Разработка Tab Bar навигации iOS-приложения — одна из наших ключевых компетенций. Когда к нам приходит проект с навигацией на таббаре, мы начинаем с системного компонента UITabBarController. Apple рекомендует его для приложений с двумя-пятью равнозначными разделами. Кажется, что всё просто: перетащил контроллер, настроил вкладки — готово. Но нюансы появляются сразу, как только нужен кастомный внешний вид, badge с динамическим счётчиком или конкретное поведение при повторном тапе на активную вкладку. Сертифицированные специалисты с 7-летним опытом — мы реализовали таббар-навигацию в десятках проектов, от новостных приложений до банковских клиентов. Набили шишки на каждой из типичных ошибок и теперь гарантируем, что ваш таббар пройдёт ревью App Store с первого раза. Стоимость базовой настройки таббара составляет от 1000 до 3000 рублей.
Типичные сложности
Кастомная настройка внешнего вида. С iOS 15 Apple изменила систему кастомизации — UITabBar.appearance() перестал работать для части параметров. Теперь правильный путь: UITabBarAppearance + UITabBarItemAppearance. Если этого не учесть, на iOS 15+ таббар получает белый или серый фон вместо кастомного, а приложение выглядит сломанным:
let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .systemBackground tabBar.standardAppearance = appearance tabBar.scrollEdgeAppearance = appearance Этот фрагмент задаёт единый фон для обоих состояний. Мы всегда его добавляем в шаблон проекта — это экономит 20–30 минут отладки на новом SDK.
Badge-счётчики. tabBarItem.badgeValue = "3" работает из коробки, но красный круг нельзя изменить по цвету без дополнительных телодвижений. Начиная с iOS 10 появилось свойство badgeColor, но его часто упускают из виду. Если нужна совсем нестандартная форма — например, квадратный badge с закруглёнными углами — приходится создавать кастомный overlay поверх иконки вкладки. Сравнение подходов:
| Метод | Сложность | Гибкость |
|---|---|---|
badgeColor |
Низкая | Только цвет |
setBadgeTextAttributes |
Средняя | Текст и тень |
| Кастомный UIView | Высокая | Полная кастомизация |
Для 90% сценариев достаточно badgeColor. Мы используем кастомный view только когда нужно анимировать badge (например, пульсация) — это бывает раз в пять проектов.
Когда нужен кастомный badge-виджет?
Если требуется анимированный badge (пульсация, смена цвета по событию) или нестандартная форма (треугольник, скруглённый квадрат), стандартные средства не подходят. Мы разработали reusable компонент, который добавляется как subview к tabBarButton и синхронизируется с badgeValue.Повторный тап на активную вкладку. По умолчанию ничего не происходит. Пользователь ожидает, что список прокрутится вверх. Реализация через UITabBarControllerDelegate:
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { guard let nav = viewController as? UINavigationController, let top = nav.topViewController, let scroll = top.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView else { return } scroll.setContentOffset(.zero, animated: true) } Этот код — универсальное решение. Мы добавили его в свою библиотеку компонентов и используем в каждом проекте. Экономит 30 минут на внедрение. Готовое решение работает в 5 раз быстрее, чем написание собственного с нуля.
Скрытие таббара при прокрутке — ещё один частый запрос. Реализуется через наблюдение за contentOffset UIScrollView. Мы прячем таббар анимацией вместе с контентом, чтобы не было дёрганий. Этот паттерн описан в документации Apple в разделе HIG.
Как настроить кастомный внешний вид таббара на iOS 15+?
В iOS 15–17 сломалась прямая установка tintColor и barTintColor. Вместо этого используется UITabBarAppearance. Выполните три шага:
- Создайте
UITabBarAppearance. - Установите
backgroundColorилиbackgroundEffect. - Присвойте
standardAppearanceиscrollEdgeAppearance.
Сравнение с iOS 14: в iOS 14 можно было обойтись одной строчкой tabBar.barTintColor = ..., теперь это в 3 раза больше кода, но гибкость выше — можно задать разные стили для обычного состояния и при прокрутке. Мы всегда настраиваем оба, чтобы избежать белого фона на iOS 15+.
Почему повторный тап на вкладку не скроллит вверх?
Это известная проблема: UITabBarController не вызывает scroll-to-top по умолчанию. Причина — Apple оставила эту логику разработчику. Мы решаем это через делегат, как показано выше. Более того, если внутри вкладки несколько скролл-вью (например, Carousel + список), нужно определить, какой именно скроллить. Мы используем first(where:) — для стандартных иерархий этого достаточно.
SwiftUI
В SwiftUI используем TabView с .tabItem модификатором. С iOS 18 появился новый Tab тип и сайдбар-поддержка для iPad. Однако для сложной кастомной анимации или badge с динамическим обновлением TabView пока не дотягивает. В таких случаях мы оборачиваем UITabBarController через UIViewControllerRepresentable. Это даёт полный контроль без потери производительности — всего 40–50 строк кода.
Что входит в работу
- Настройка
UITabBarControllerилиTabViewс нужным количеством вкладок. - Кастомный внешний вид через
UITabBarAppearanceс учётом iOS 15+. - Badge-счётчики с обновлением из сервиса уведомлений (APNs/FCM).
- Scroll to top при повторном тапе на вкладку.
- Скрытие таббара при прокрутке (опционально).
- Настройка глубоких ссылок (deep linking) для каждой вкладки.
- Адаптация под iPad: вместо таббара можно использовать split view.
Сроки
| Задача | Время |
|---|---|
| Базовая настройка таббара | 1 день |
| Кастомный дизайн | 0.5 дня |
| Badge и уведомления | 0.5–1 день |
| Scroll-to-top и скрытие | 0.5 дня |
| Адаптация под iPad | 1–2 дня |
Закажите разработку Tab Bar навигации с нашей помощью. Получите консультацию и точную оценку вашего проекта — просто напишите нам с описанием функционала. Сокращаем время разработки на 30% за счёт готовых компонентов.







