保持视图在导航控制器
的所有视图背后的最佳方式,并提前致谢。保持视图在导航控制器
我找咨询如何布局视图控制器在我的应用程序,在那里我仍然有一个执着的背景有几个背景动画
这是它是如何设置当前沿:
- 的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方法。后面的勾号似乎不起作用,因为以代码字体结尾的代码的唯一部分是缩进的代码。任何人都知道这样做的正确方法?再次感谢。
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掉掉。
感谢您的建议!
在我当前的实现中,背景图像和SpriteLayer是RootViewController的成员,我将它们添加到RootViewController的loadView中的导航控制器的视图中。然后,我可以使用内置到UIViewControllers中的自动调整挂钩。 – 2010-11-14 16:32:00
请勿使用多个视图控制器。相反,让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方法来实现。
将SpriteLayer添加到当前UIViewController的问题在于,它会导致SpriteLayer中的所有内容从侧面滑入,作为所需动画的一部分为那个UIViewController。我想要的是SpriteLayer放置在视图控制器的动画下面(这就是为什么我将它添加到AppDelegate的主窗口中) – 2010-11-14 09:05:02
我有许多UINavigationController子类的问题,因为我真的无法获得任何功能或控制调整大小。 – 2010-11-14 16:30:04
UINavigationController的子类化不是必需的。我有一个我可以发布的工作示例。仍然感兴趣? – bentford 2010-12-01 16:33:21
我在第一段中明白了:) 1/2 – 2010-11-15 04:10:06