【问题标题】:TabBar gets lost when using custom seque transition. How to get it back?使用自定义序列转换时 TabBar 会丢失。怎么找回来?
【发布时间】:2012-02-27 13:15:12
【问题描述】:

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

TabBar 控制器作为具有两个选项卡的初始视图控制器。 在每个选项卡上,附加了更多视图作为内容。

在一个选项卡上,我有导航控制器,后面有几个视图。 在这里我没有问题。我可以使用自定义按钮和导航栏来回移动。 此外,在视图的所有移动过程中,TabBar 始终处于其位置。

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

我已经阅读了一些关于在视图堆栈中弹出标签栏控制器的内容,但是我能找到的所有示例都对我不起作用。

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

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

我的“(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

【问题讨论】:

  • 在第二个选项卡中,我认为您使用的是“模态”segue(不是 seque)。这意味着您正在现有视图层次结构(包括选项卡栏)上打开模态全屏视图,并且当您“导航回来”(我认为您已经创建了另一个模态 segue)时,您打开了另一个模态全屏视图。 “导航回来”的正确方法是调用 [self dismissModalViewControllerAnimated:YES]。
  • 不,它不是第二个选项卡中的“模态”序列。使用 Modal,无法将自定义序列与自定义动画一起使用。
  • 好吧,我尝试了各种不同的序列类型。 1) 推送 2) 模态 3) 自定义 |唯一不隐藏 TabBar 的是第一个 - Push。这个序列的不好的一面是它不可能(我没有找到任何方法来做到这一点)在这里应用任何自定义动画进行转换。所以推送是完全不可能的。

标签: iphone ios5 storyboard uitabbar


【解决方案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];
}

【讨论】:

  • 嗨 Hoshi,我知道如何制作基本的自定义序列,但我仍然尝试了你的。因此,当使用您的“(void)perform”代码时,我的观点只是从源代码转换到源代码。 (就像 *src 和 *dst 是相同的视图)。我用我的 Seque 代码示例更新了我的初始帖子。
  • 也许这意味着您在第二个选项卡中没有 UINavigationController ...我也阅读了您的示例。 “self.appDelegate.window.rootViewController=destViewController;”意味着你用 destViewController 替换整个屏幕(包括标签栏控制器和标签中的所有 vc,而不是当前标签中的一个 vc)。
【解决方案2】:

因此,在互联网上摆弄了各种样本之后,虽然似乎仍然没有按预期工作,但我放弃了我的自定义序列动画以供以后破解。决定坚持几乎有点 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 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 不会迷路。 :)

事实上,问题的关键在于这条线,和 Hoshi 建议的一样。

[self.navigationController popViewControllerAnimated:YES];

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

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多