所以我决定尝试使用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
答案 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];
这是按下自定义按钮(而不是标准导航栏上的后退按钮)时向我提供向后幻灯片动画的唯一方法
干杯!