UITabBar / UITabBarController Blocking Touches When Scrolled Away

111 views Asked by At

I have a custom subclass of UITabBarController which adapts a delegate that has a function to shift the tabBar's frame (specifically frame.origin.y). When the offset is equal to the height of the screen (that is, it is hidden off-screen) I have a UIScrollView extending to the bottom of the screen. Within that UIScrollView, I cannot receive touches in the initial frame of the tabBar view.

I have seen recommendations to add intractable subviews to the UITabBar or the controller's view. This is far from elegant, and creates a multitude of design issues when working with views that possibly take up the whole screen. I have checked out the little public implementation code of UITabBarController and UITabBar but nothing I saw there shows how they are blocking those touches.

I'm aware of the recursive nature of hit tests, but short of overriding the hit test and rerouting the touch in the UITabBarController subclass, which seems rather unclean, I can't think of a generic way to handle this. This question dives into Apple's UITabBarController / UITabBar implementation, but I have included some relevant code for clarity:

class tab_bar_controller: UITabBarController, UITabBarControllerDelegate, tab_bar_setter //has included function
{

//.... irrelevant implementation


    func shift(visibility_percent: CGFloat) -> CGFloat //returns origin
    {
            self.tabBar.frame.origin.y = screen_size().height - (visibility_percent * self.tabBar.frame.size.height)
            self.tabBar.userInteractionEnabled = visibility_percent != 0 //no effect
            //self.view.userInteractionEnabled = visibility_percent != 0 //blocks all touches within screen.bounds
            return self.tabBar.frame.origin.y
    }
}
0

There are 0 answers