使用自定义segue转换时,TabBar会丢失。怎么回来?

时间:2012-02-05 22:36:56

标签: iphone ios5 storyboard uitabbar

所以我决定尝试使用StoryBoarding构建一个iPhone应用程序。 我有一个基本的基于选项卡的应用程序设置,非常快。

TabBar控制器作为初始View控制器,带有两个选项卡。 在每个标签上,有更多视图作为内容附加。

在一个标签上我有导航控制器,后面有更多的视图。 我没有问题。我可以使用自定义按钮和导航栏来回移动。 在通过视图的所有移动过程中,TabBar也总是在它的位置。

然后我得到了第二个标签。 这里没有导航控制器, 因为,在第二个选项卡上,我需要使用自定义seques在视图之间创建自定义过渡动画。到目前为止,没有关于seques,动画和过渡的问题(至少我几乎得到了我需要的动画:))。 但是我被困在那里的是TabBar。 只要按下任何按钮,使用自定义序列导航到另一个视图,我就会丢失我的TabBar。即使我导航回初始视图,也不再有TabBar。

我已经阅读了有关在视图堆栈中弹出tabbar控制器的内容,但我找到的所有示例都不适用于我。

如果有人遇到类似问题,请分享解决方案。任何指向一些好的教程或样本的人都将非常感激。

编辑: 所以我的自定义seque看起来像这样:

my“(void)perform”看起来像这样: (至少它按照预期从源到目标动画。唯一错误的是,TabBar被隐藏或解散)

#import "XCustomSeque.h"
#import <QuartzCore/QuartzCore.h>
@implementation XCustomSeque
@synthesize appDelegate=_appDelegate;
-(void) perform{
    UIViewController *srcViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destViewController = (UIViewController *) self.destinationViewController;

    self.appDelegate = [[UIApplication sharedApplication] delegate];

    CATransition* trans = [CATransition animation];    
    [trans setType:kCATransitionMoveIn];
    [trans setFillMode:kCAFillModeBoth];
    [trans setDuration:1];
    [trans setSubtype:kCATransitionFromLeft];

    CALayer *layer = destViewController.view.layer;

    [srcViewController.view removeFromSuperview];
    [self.appDelegate.window addSubview:destViewController.view];
    [layer addAnimation:trans forKey:nil]; 

    self.appDelegate.window.rootViewController=destViewController;
}
@end

2 个答案:

答案 0 :(得分:1)

在第二个标签中,您还需要使用导航控制器,但关闭“显示导航栏”。您的故事板如下所示。

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(custom)-> [VC-2-2]
            (hides nav bar)

当您从VC-2-1导航到VC-2-2时,您使用自定义segue(UIStoryboardSegue的子类),使用-perform方法,如下所示。 (见How to create custom modal segue in 4.2 Xcode using storyboard

- (void)perform
{
    UIViewController *src = self.sourceViewController;
    UIViewController *dst = self.destinationViewController;
    [UIView transitionWithView:src.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        [src.navigationController pushViewController:dst animated:NO];
                    }
                    completion:NULL];
}

当您从VC-2-2导航回VC-2-1时,您不想使用segue,因为它会创建VC-2-1的新副本。相反,您使用动作方法(按下后退按钮时调用),如下所示。

- (IBAction)goBack:(id)sender
{
    [UIView transitionWithView:self.navigationController.view duration:0.2
                       options:UIViewAnimationOptionTransitionFlipFromRight
                    animations:^{
                        [self.navigationController popViewControllerAnimated:NO];
                    }
                    completion:NULL];
}

答案 1 :(得分:0)

所以在用各种样本在互联网上搞乱之后,虽然似乎没有按预期工作但我放弃了我的自定义seque动画以供以后的黑客攻击。决定坚持几乎有点Hoshi建议。至少我的标签栏始终可见,动画的代码更少。

所以使用StoryBoarding我最终得到了这个(与Hoshi的建议略有不同):

        +-> [NavC-1] --> [VC-1-1] --(push)-> [VC-1-2] ...
        |   (shows nav bar)
[TabC] -+
        |
        +-> [NavC-2] --> [VC-2-1] --(push)-> [VC-2-2]
            (hides nav bar)

我使用标准Push Seque进行前向幻灯片切换(此处未编写代码,所有内容均在StoryBoard上)

然后在第二个分支上,我需要一个没有导航栏和自定义后退按钮的视图,当按下它时会启动向后幻灯片切换。当然,Tab栏必须保持原样。 导航栏很容易隐藏,只需取消勾选[NavC-2]属性面板中的“显示导航栏”即可。 现在,为了获得向后幻灯片切换,我为第二个分支中的每个View Controller创建了自定义类,并用以下内容填充它们:

#import "VC_2_1.h"   
@implementation VC_2_1

- (IBAction)on_back_button_pressed:(id)sender 
{
    [self.navigationController popViewControllerAnimated:YES]; 
}

@end

on_back_button_pressed是[VC-2-1]上的后退按钮调用的内容。 [VC-2-2]和第二个分支中跟随的任何其他VC也是如此。

所有这些人都给了我我需要的东西。 按自定义按钮并使用幻灯片左右动画在视图之间导航。并且tabbar不会迷路。 :)

事实上问题的关键在于这一行,与Hoshi建议的相同。

[self.navigationController popViewControllerAnimated:YES];

这是按下自定义按钮(而不是标准导航栏上的后退按钮)时向我提供向后幻灯片动画的唯一方法

干杯!