如何从 UITabBarController 页面导航到具有 PUSH 样式的另一个视图控制器

Posted

技术标签:

【中文标题】如何从 UITabBarController 页面导航到具有 PUSH 样式的另一个视图控制器【英文标题】:How to navigate to another viewcontroller with PUSH style from UITabBarController page 【发布时间】:2015-05-20 09:13:08 【问题描述】:

首先,我是初学者。原谅我这个愚蠢的问题。

我使用UITabBarController 创建了两个子页面,第一页包括UIButton,并且我还创建了另一个页面(DetailPage)。我用segue连接了按钮和DetailPage。但是segue的样式不能设置为push。(这会引发错误,push样式只用于UINavigatorController)。

那么,当我单击按钮时,如何以 PUSH 样式导航到 DetailPage?

我尝试了一种新方法,使用UINavigatorController管理首页和DetailPage,然后将thisUINavigatorController嵌入到UITabItem中。完成此操作后,我可以使用 push 样式导航到 DetailPage。但是出现了另一个问题,在导航 DetailPage 时,TabBar 始终停留在页面底部。我想把所有UITabBarController 推到左边。

我想要的效果如下图:

如何优化我的代码?

【问题讨论】:

您的设置似乎很好.. 有条件地隐藏底部选项卡栏只需在详细页面视图控制器的视图中设置self.hidesBottomBarWhenPushed = true; 并将其设置为false 在视图中将出现方法第一个视图控制器... 不错的解决方案,我明白了。非常感谢。 【参考方案1】:

像这样实现委托(UITabBarControllerDelegate)方法:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 

    NSArray *tabViewControllers = tabBarController.viewControllers;
    UIView * fromView = tabBarController.selectedViewController.view;
    UIView * toView = viewController.view;
    if (fromView == toView)
        return false;
    NSUInteger fromIndex = [tabViewControllers indexOfObject:tabBarController.selectedViewController];
    NSUInteger toIndex = [tabViewControllers indexOfObject:viewController];

    [UIView transitionFromView:fromView
                        toView:toView
                      duration:0.3
                       options: toIndex > fromIndex ? UIViewAnimationOptionTransitionFlipFromLeft : UIViewAnimationOptionTransitionFlipFromRight
                    completion:^(BOOL finished) 
                        if (finished) 
                            tabBarController.selectedIndex = toIndex;
                        
                    ];
    return true;

这是用于翻转动画只需更改动画

对于推送:

    CATransition* transition = [CATransition animation];
    [transition setDuration:0.3];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromLeft;
    [transition setFillMode:kCAFillModeBoth];
    [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [view.layer addAnimation:transition forKey:kCATransition]; 

流行音乐:

    CATransition* transition = [CATransition animation];
    [transition setDuration:0.3];
    transition.type = kCATransitionPush;
    transition.subtype = kCATransitionFromRight;
    [transition setFillMode:kCAFillModeBoth];
    [transition setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [view.layer addAnimation:transition forKey:kCATransition];

现在由你决定,祝你好运......

【讨论】:

也许您的解决方案用于在 tabBarController 中从一个视图控制器导航到另一个视图控制器。我用self.hidesBottomBarWhenPushed = true 得到它。还是谢谢大家。 对不起!!我误解了。 :(根据我的理解,你想用推弹动画改变标签。顺便恭喜!!!

以上是关于如何从 UITabBarController 页面导航到具有 PUSH 样式的另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 View 获取数据到 UITabBarController

如何从自己的子视图控制器中关闭模态 uitabbarcontroller

如何使用 Swift 从 UITabBarController 的子类触发动作

如何从它的项目 ViewControllers 访问 UITabBarController 的变量

如何从应用程序委托访问 uitabbarcontroller 内的 uinavigationcontroller 内的 uitableview?

从ViewController中的符号转换到UITabBarController