 // MARK: Transitions.
 
 extension UIViewController {
+    /// Indicate the view controller managed by TabNavigationController will
+    /// begin transition by gesture.(The content scroll view will begin dragging.)
+    ///
     open func viewWillBeginInteractiveTransition() { /* No imp for now. */ }
-    open func viewDidEndInteractiveTransition()    { /* No imp for now. */ }
+    /// Indicate the view controller managed by TabNavigationController will end 
+    /// dragging trasition.
+    ///
+    /// - Parameter appearing: Indicate the view controller is about to call `viewWillAppear(:)` or not.
+    ///
+    open func viewDidEndInteractiveTransition(appearing: Bool) { /* No imp for now. */ }
 }
 
 // MARK: Layout guide.

    }
    
    public func tabNavigationBar(_ tabNavigationBar: TabNavigationBar, didSelectTitleItemAt index: Int) {
        _endsRootViewControllersAppearanceTransitionIfNeccessary()
    }
    
    public func tabNavigationBarDidTouchNavigatiomBackItem(_ tabNavigationBar: TabNavigationBar) {

        if updateNavigationBar { _tabNavigationBar.setSelectedTitle(at: index, animated: animated) }
        
        _beginsRootViewControllersAppearanceTransition(at: index, updateNavigationItems: updateNavigationItems, animated: animated)
        if !animated { _endsRootViewControllersAppearanceTransitionIfNecessary() }
    }
    
    fileprivate func _beginsRootViewControllersAppearanceTransition(at index: Array<UIViewController>.Index, updateNavigationItems: Bool, animated: Bool) {
        guard _earlyCheckingBounds(index, in: _rootViewControllersContext.viewControllers) else { return }
        
        let viewController = _rootViewControllersContext.viewControllers[index]
