2012-02-05 62 views
2

所以我决定尝试使用StoryBoarding构建iPhone应用程序。 我有一个基本的基于选项卡的应用程序设置,相当快。使用自定义序列转换时,TabBar会丢失。如何恢复?

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

在一个选项卡上,我有导航控制器只有几个视图。 在这里我没有任何问题。我可以使用自定义按钮和导航栏来回移动。 TabBar也始终在它通过视图的所有移动的地方。

然后我得到第二个标签。 没有导航控制器, ,因为在第二个选项卡上我需要使用自定义seques在视图之间创建自定义过渡动画。到目前为止,seques,动画和转换都没有问题(至少我几乎得到了我需要的动画:))。 但是我被卡住的是TabBar。 只要我按任何按钮,将导航到另一个视图使用自定义seque我失去了我的TabBar。即使我回到初始视图,也没有TabBar了。

我读过一些关于弹出视图堆栈中的tabbar控制器的信息,但是我能找到的所有示例都不适用于我。

如果有人遇到类似的事情,请分享解决方案。任何指向一些很好的教程或示例将非常感激。

编辑: 所以我自定义塞克看起来是这样的:

我“(无效)执行”看起来是这样的: (至少从源动画为预期目标,这是错误的唯一的事,是的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 
+0

在第二个选项卡中,我认为您使用的是“Modal”segue(而不是seque)。这意味着您将在现有视图层次结构(包括选项卡栏)上打开模态全屏视图,并且当您“导航回”(我认为您已创建另一个模态轮廓)时,将打开另一模态全屏视图。 “导航回”的正确方法是调用[self dismissModalViewControllerAnimated:YES]。 – hoshi 2012-02-06 01:06:59

+0

不,它不是第二个选项卡中的“Modal”序列。使用Modal时,不能使用Custom seque和自定义动画。 – tigukargas 2012-02-06 05:41:31

+0

好吧,我尝试了所有不同的seque类型。 1)Push 2)Modal 3)Custom |唯一不隐藏TabBar的是第一个 - 推。这个seque的坏处是它不可能(我没有找到任何办法)在这里为转换应用任何自定义动画。所以推动是毫无疑问的。 – tigukargas 2012-02-06 07:48:59

回答

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,您使用自定义赛格瑞(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,你不想因为它创造了VC-2-1的新副本使用SEGUE。相反,您可以使用一个操作方法(在按下后退按钮时调用),如下所示。

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

嗨Hoshi, 我知道如何做基本的自定义seques,但我仍然尝试过你的。 所以当使用你的“(void)执行”代码时,我的视图只是从源代码翻译到源代码。 (比如* src和* dst是相同的视图)。 我用我的Seque代码示例更新了我的初始文章。 – tigukargas 2012-02-06 16:14:10

+0

也许这意味着你在第二个标签中没有UINavigationController ...我也读过你的示例。 “self.appDelegate.window.rootViewController = destViewController;”意味着用destViewController替换整个屏幕(包括标签栏控制器和标签中的所有vc,而不是当前标签中的一个vc)。 – hoshi 2012-02-07 09:01:25

0

因此,与各种样品互联网上玩弄后,同时仍似乎没有如预期我放弃我的自定义塞克动画后黑客工作。决定坚持几乎有点,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) 

我使用的标准推组合舞蹈的向前滑动过渡(无这里写的代码,一切都是故事板)

然后在第二个分支上,我需要有一个没有导航栏的视图和自定义的后退按钮,当它按下时会启动向后滑动转换。当然,标签栏必须保持在原来的位置。 导航栏很容易隐藏,只需在[NavC-2]属性面板中取消选中“显示导航栏”即可。 现在让我在第二分支创建自定义类每个视图控制器的背向滑步过渡以及与此填满了:

#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不会迷路。 :)

事实上,问题的关键是这条线,与霍希建议的一样。

[self.navigationController popViewControllerAnimated:YES]; 

这是在自定义按钮按下时,给了我向后滑动动画(不后退按钮上的标准导航栏)

干杯的唯一途径!