2010-11-14 203 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