lynnswap/tabbarmenu
**TabBarMenu** is a lightweight Swift Package that adds long-press context menus (`UIMenu`) to
Requirements
- iOS 18.0+
- Swift 6.2 (Swift tools version in
Package.swift)
Installation (Swift Package Manager)
In Xcode:
- File → Add Packages…
- Enter the repository URL
- Add the TabBarMenu product to your target
Quick start
- Conform to
TabBarMenuDelegate - Set
menuDelegateon your tab bar controller - Return a
UIMenufor the pressed tab
Tip: You can implement the
UITabdelegate method, theUIViewControllerdelegate method, or both. If both are implemented, TabBarMenu tries theUITabdelegate method first (whenUITabBarController.tabsis available) and falls back to the view-controller delegate method.
import UIKit
import TabBarMenu
final class MainTabBarController: UITabBarController, TabBarMenuDelegate {
override func viewDidLoad() {
super.viewDidLoad()
menuDelegate = self
}
// iOS 18+ UITab-based API
func tabBarController(_ tabBarController: UITabBarController, tab: UITab?) -> UIMenu? {
makeMenu(title: tab?.title)
}
// Classic UIKit (viewControllers-based)
func tabBarController(_ tabBarController: UITabBarController, viewController: UIViewController?) -> UIMenu? {
makeMenu(title: viewController?.tabBarItem.title)
}
private func makeMenu(title: String?) -> UIMenu? {
guard let title else { return nil }
let rename = UIAction(title: "Rename") { _ in
// Handle rename
}
let delete = UIAction(title: "Delete", attributes: .destructive) { _ in
// Handle delete
}
return UIMenu(title: title, children: [rename, delete])
}
}- Return
nilto disable the menu for a specific tab. - Set
menuDelegate = nilto detach TabBarMenu.
Optional: configuration
updateMenuConfiguration { configuration in
configuration.minimumPressDuration = 0.5
configuration.maxVisibleTabCount = 5
}Demo app
Open Examples/TabBarDemo/TabBarDemo.xcodeproj and run the TabBarDemo scheme on iOS 18+.
License
MIT. See LICENSE.
Package Metadata
Repository: lynnswap/tabbarmenu
Default branch: main
README: README.md