如何使用UITabBarController进行“滚动到全屏”?

时间:2014-10-21 09:21:21

标签: ios objective-c uiscrollview uitabbarcontroller uitabbar

大家。我是ios应用程序编程的超级初学者,使用TabBar创建视图时遇到了麻烦,这些视图将在滚动视图上向上/向下滚动隐藏。 (观点会像pinterest一样......)

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

但是,在此示例中,TabBar和ToolBar似乎仅在视图顶部显示和消失,并且不在屏幕中间工作。

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

提前为我凌乱的着作道歉...

但是,请帮帮我!!!

1 个答案:

答案 0 :(得分: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;
                 }];
}  

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

如果滚动视图在用户停止滚动后滚动,并且仅在滚动结束时滚动,则仅调用第二种方法。
然后我们将运行与上面相同的代码,再次显示选项卡和导航栏。

我们基本上只是创建一个动画,它将标签框和导航栏移出视图或视图。

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

祝你好运。