【问题标题】:how can I make "scroll-to-fullscreen" with UITabBarController?如何使用 UITabBarController 制作“滚动到全屏”?
【发布时间】:2026-01-07 13:00:01
【问题描述】:

每个人。我是 ios 应用程序编程的超级初学者,并且完全无法使用 TabBar 制作视图,该视图将在滚动视图上向上/向下滚动时被隐藏。 (视图会像 pinterest 一样......)

我在网上彻底搜索,找到了一个这样的图书馆; YIFullScreenScroll from GitHub

但是,在这个示例中,TabBar 和 ToolBar 似乎只在视图顶部出现和消失,而在屏幕中间没有工作。

我真的很想知道如何控制 TabBar 和 ToolBar 的隐藏,即使在滚动视图的中间。(就像 Pinterest...)

提前为我乱七八糟的文字道歉......

但是,请帮帮我!!!

【问题讨论】:

    标签: ios objective-c uiscrollview uitabbarcontroller uitabbar


    【解决方案1】:

    我不熟悉 Pinterest,所以我希望我能正确理解你想要做什么。
    我自己对objective-c有点陌生,所以也许有一种更简单的方法可以做到这一点,但这可以完成工作。

    我的母语不是英语,所以如果我的解释不够清楚,请告诉我,我会尝试改写。

    首先,符合 UIScrollView 委托,创建 2 个属性来保存标签栏和导航栏的原始框架

    另外,将滚动视图的委托设置为视图控制器,无论是从界面构建器还是通过代码

    ViewController.m  
    @interface ViewController () <UIScrollViewDelegate>  
    @property (nonatomic) CGRect navBarFrame;  
    @property (nonatomic) CGRect tabBarFrame;  
    @end  
    

    然后,在viewDidLoad中,设置上面的属性

    - (void)viewDidLoad {  
        [super viewDidLoad]  
        self.navBarFrame = self.navigationController.navigationBar.frame;  
        self.tabBarFrame = self.tabBarController.tabBar.frame;  
    }  
    

    现在我们将使用滚动视图的委托方法来确定滚动何时开始。

    首先,我们从滚动开始时调用的委托开始,以隐藏导航栏和标签栏

    - (void)scrollViewDidBeginDragging:(UIScrollView *)scrollView  
    {  
            [UIView animateWithDuration: 0.3
                          delay: 0
                        options: UIViewAnimationOptionCurveLinear
                     animations: ^(void){
                         CGFloat tabBarX = self.tabBarController.tabBar.frame.origin.x;
                         CGFloat tabBarWidth = self.tabBarController.tabBar.frame.size.width;
                         CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
                         self.tabBarController.tabBar.frame = CGRectMake(tabBarX, self.view.frame.size.height, tabBarWidth, tabBarHeight);
    
                         CGFloat navBarX = self.navigationController.navigationBar.frame.origin.x;
                         CGFloat navBarWidth = self.navigationController.navigationBar.frame.size.width;
                         CGFloat navBarHeight = self.navigationController.navigationBar.frame.size.height;
                         self.navigationController.navigationBar.frame = CGRectMake(navBarX, 0, navBarWidth, navBarHeight);
                     }
                     completion: ^(BOOL finished){
                         if(finished){
                             [self.tabBarController.tabBar setHidden: YES];
                             [self.navigationController.navigationBar setHidden: YES];
                         }
                     }];
    }  
    

    现在我们将使用 2 个委托方法来确定滚动何时结束以再次显示标签栏和导航栏。

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
    {  
    if(!decelerate){
    
        [self.tabBarController.tabBar setHidden: NO];
        [self.navigationController.navigationBar setHidden: NO];
    
        [UIView animateWithDuration: 0.3
                         animations: ^(void){
                             self.tabBarController.tabBar.frame = self.tabBarFrame;
                             self.navigationController.navigationBar.frame = self.navBarFrame;
                         }];
            }
    }  
    
    
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView  
    {  
        [self.tabBarController.tabBar setHidden: NO];
        [self.navigationController.navigationBar setHidden: NO];
    
        [UIView animateWithDuration: 0.3
                         animations: ^(void){
                             self.tabBarController.tabBar.frame = self.tabBarFrame;
                             self.navigationController.navigationBar.frame = self.navBarFrame;
                     }];
    }  
    

    我们调用 2 个单独的方法的原因是,当用户停止滚动时,第一个会被调用,即使滚动视图仍在滚动(比如当您滚动非常快,然后停止滚动时,滚动视图仍在滚动几秒钟,直到完全停止)
    第一种方法还有一个变量“减速”,它检查滚动是否仍在滚动。
    由于我不想在滚动视图仍在滚动时显示标签栏和导航栏,
    第一种方法将运行代码再次显示导航栏和标签栏,仅当“减速”为假时,意味着滚动停止,

    第二个方法只有在用户停止滚动后滚动视图确实滚动时才会被调用,并且只有在滚动结束时才会被调用。
    然后我们将运行与上面相同的代码,再次显示选项卡和导航栏。

    我们基本上所做的只是创建一个动画,它将选项卡和导航栏的框架移出视图或移入视图。

    我随机设置动画时长为0.3,
    如果您希望条形图更快或更慢地显示和隐藏,您可以将其更改为或多或少。

    祝你好运。

    【讨论】:

    • 非常感谢您的资源!你的解释很清楚,所以我不需要进一步改写....我检查了你给我的方法,我发现它有效!但是,使用 '- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate' 方法,动画看起来有点奇怪。因此,正如您所建议的,我将使用另一种方法。无论如何,非常感谢您的帮助!!!!