2010-11-14 276 views
3

的所有视图背后的最佳方式,并提前致谢。保持视图在导航控制器

我找咨询如何布局视图控制器在我的应用程序,在那里我仍然有一个执着的背景有几个背景动画

这是它是如何设置当前沿:

  • 的AppDelegate使得导航控制器,RootViewController的和一个Sprite层(其子类的UIView)
  • AppDelegate中还保持的背景图像作为其backgroundColor属性
  • 导航控制器初始化与根视图控制器,为正常
  • 的rootview控制器推动不同表视图到导航堆栈

而在代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

UIImageView* backgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"underthesea.jpg"]] autorelease]; 
backgroundView.contentMode = UIViewContentModeScaleAspectFill; 
backgroundView.frame = [UIScreen mainScreen].bounds; 

self.viewController = [[[RootViewController alloc] init] autorelease]; 
self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; 
self.spriteLayer = [[[SpriteLayer alloc] initWithFrame:self.viewController.view.frame] autorelease]; 
self.viewController.spriteLayer = self.spriteLayer; 

[window addSubview:backgroundView];  
[window addSubview:self.spriteLayer]; 
[window addSubview:self.navigationController.view]; 

[window makeKeyAndVisible]; 
return YES; 
} 

`

所有时间, Sprite图层在背景中可见,包含不同的动画。问题是,现在我试图实现自动化并有困难,因为精灵层中的视图不在UIViewController中。我认为一种可能性是使SpriteLayer的子类UIViewController,但不要把它放在导航控制器中;它只会存在于导航控制器显示的任何视图之后。我不知道是否有2个视图控制器在这样的同时会成为错误的来源或只是糟糕的设计,因为我已经阅读了StackOverflow,这不是视图控制器的预期设计。

在这里有什么意见?

干杯, 丰富

附:我无法在代码块中添加一个客观的C方法。后面的勾号似乎不起作用,因为以代码字体结尾的代码的唯一部分是缩进的代码。任何人都知道这样做的正确方法?再次感谢。

+0

我在第一段中明白了:) 1/2 – 2010-11-15 04:10:06

回答

5

Bentford,我没有想到直接将SpriteLayer视图添加到UINavigation视图,因为我不认为这是UINavigation的预期用途。但它的工作原理就像一个魅力:)

所有我不得不改变是:

[window addSubview:backgroundView];  
[window addSubview:self.spriteLayer]; 
[window addSubview:self.navigationController.view]; 

到:

[self.navigationController.view insertSubview:backgroundView atIndex:0]; 
[self.navigationController.view insertSubview:self.spriteLayer atIndex:1]; 
[window addSubview:self.navigationController.view]; 

,然后加入少许autoresizeMask到backgroundView和噗我有一个自动尺寸背景+精灵,当视图控制器被推到导航堆栈上时,不会被git掉掉。

感谢您的建议!

+0

在我当前的实现中,背景图像和SpriteLayer是RootViewController的成员,我将它们添加到RootViewController的loadView中的导航控制器的视图中。然后,我可以使用内置到UIViewControllers中的自动调整挂钩。 – 2010-11-14 16:32:00

0

请勿使用多个视图控制器。相反,让SpriteLayer继承UIView子类,并将其直接添加到当前可见的UIViewController视图中。

只记得可见的UIViewController会触发旋转事件。但通过这种方式设置SpriteLayer,您可以使用自动调整大小或在didRotateToInterfaceOrientation中手动调整大小。

只需将SpriteLayer添加到您的UINavigationController中,即可将其添加到view属性中。要做到这一点的一个好方法是通过继承的UINavigationController和覆盖viewDidLoad

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    SpriteLayer *spriteLayer = [[SpriteLayer alloc] initWithFrame:CGRectMake(0, 300, 320, 50)]; 
    [self.view addSubview:spriteLayer]; 

} 

的推动和弹出动画将在后面SpriteLayer运行。其他行为可以通过使用sendSubviewToBack和相关的UIView方法来实现。

+0

将SpriteLayer添加到当前UIViewController的问题在于,它会导致SpriteLayer中的所有内容从侧面滑入,作为所需动画的一部分为那个UIViewController。我想要的是SpriteLayer放置在视图控制器的动画下面(这就是为什么我将它添加到AppDelegate的主窗口中) – 2010-11-14 09:05:02

+0

我有许多UINavigationController子类的问题,因为我真的无法获得任何功能或控制调整大小。 – 2010-11-14 16:30:04

+0

UINavigationController的子类化不是必需的。我有一个我可以发布的工作示例。仍然感兴趣? – bentford 2010-12-01 16:33:21