UITabBar Appears During Swipe-Back Gesture on iOS 26 Liquid Glass UI

Hello,

While integrating the Liquid Glass UI introduced in iOS 26 into my existing app, I encountered an unexpected issue.

My app uses a UITabBarController, where each tab contains a UINavigationController,
and the actual content resides in each UIViewController.
Typically, I perform navigation using navigationController?.pushViewController(...) and hide the TabBar by setting vc.hidesBottomBarWhenPushed = true when needed.

This structure worked perfectly fine prior to iOS 26, and I believe many apps use a similar approach.
However, after enabling Liquid Glass UI, a problem occurs.


Problem Description

  1. From AViewController, I push BViewController with hidesBottomBarWhenPushed = true.
  2. BViewController appears, and the TabBar is hidden as expected.
  3. When performing a swipe-back gesture, as soon as AViewController becomes visible, the TabBar immediately reappears (likely due to A’s viewWillAppear).
  4. The TabBar remains visible for a short moment even if the gesture is canceled — during that time, it is also interactable.

Before iOS 26, the TabBar appeared synchronized with AViewController and did not prematurely show during the swipe transition.

  • Tried using the new iOS 18 API:
    tabBarController?.setTabBarHidden(false, animated: true)
    

It slightly improves the animation behavior, but the issue persists.

If hidesBottomBarWhenPushed is now deprecated or discouraged,

migrating entirely to setTabBarHidden would require significant refactoring, which is not practical for many existing apps.

Is this caused by a misuse of hidesBottomBarWhenPushed, or could this be a regression or design change in iOS 26’s Liquid Glass UI?

Minimal Reproducible Example

class AViewController: UIViewController {
    private lazy var someButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("GOGO", for: .normal)
        button.addTarget(self, action: #selector(didTapSomeButton), for: .touchUpInside)
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .green
        
        view.addSubview(someButton)
        someButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            someButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            someButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // tabBarController?.setTabBarHidden(false, animated: true)
    }
    
    @objc private func didTapSomeButton() {
        let bvc = BViewController()
        bvc.hidesBottomBarWhenPushed = true
        navigationController?.hidesBarsOnSwipe = true
        navigationController?.hidesBottomBarWhenPushed = true
        navigationController?.pushViewController(bvc, animated: true)
    }
}

class BViewController: UIViewController {
    private lazy var someButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("This is B View Controller", for: .normal)
        button.addTarget(self, action: #selector(didTapSomeButton), for: .touchUpInside)
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .red
        
        view.addSubview(someButton)
        someButton.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            someButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            someButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // tabBarController?.setTabBarHidden(true, animated: true)
    }
    
    @objc private func didTapSomeButton() {
        print("GOGO")
    }
}

// MARK: - Custom UITabBarController
class TabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let aVC = AViewController()

        tabs.append(configTab(aVC, title: "Chat", imageName: "message", identifier: "chats", badgeValue: "3"))
        tabs.append(configTab(UIViewController(), title: "Contacts", imageName: "person.2", identifier: "contacts"))
        tabs.append(configTab(UIViewController(), title: "Discover", imageName: "safari", identifier: "discover"))
        tabs.append(configTab(UIViewController(), title: "Me", imageName: "person", identifier: "me"))
        tabs.append(configSearchTab(UIViewController(), title: "Search"))
        selectedTab = tabs.last
        self.tabBarMinimizeBehavior = .onScrollDown
        self.bottomAccessory = UITabAccessory(contentView: UIToolbar())
    }

    // MARK: Configure UITab
    func configTab(_ viewController: UIViewController,
                   title: String,
                   imageName: String,
                   identifier: String,
                   badgeValue: String? = nil) -> UITab {
        let tab = UITab(title: title, image: UIImage(systemName: imageName), identifier: identifier) { tab in
            tab.badgeValue = badgeValue
            tab.userInfo = identifier
            return self.configViewController(viewController: viewController, title: title)
        }
        return tab
    }

    // MARK: Configure UISearchTab
    func configSearchTab(_ viewController: UIViewController, title: String) -> UISearchTab {
        // UISearchTab - separated from TabBar and displayed independently
        let searchTab = UISearchTab { tab in
            viewController.view.backgroundColor = .init(red: .random(in: 0 ... 1),
                                                        green: .random(in: 0 ... 1),
                                                        blue: .random(in: 0 ... 1),
                                                        alpha: 1.0)
            return self.configViewController(viewController: viewController, title: title)
        }
        return searchTab
    }

    // MARK: Configure UIViewController
    func configViewController(viewController: UIViewController, title: String) -> UINavigationController {
        let navigationController = UINavigationController(rootViewController: viewController)
        viewController.navigationItem.title = title
        return navigationController
    }
}

@Jisu_Kim Can you test and confirm if you're able to reproduce the issue using iOS 26.1 RC. Thanks

UITabBar Appears During Swipe-Back Gesture on iOS 26 Liquid Glass UI
 
 
Q