Лучший способ сохранить представление за всеми представлениями в Navigation Controller - PullRequest
3 голосов
/ 14 ноября 2010

и заранее спасибо.

Я ищу совет о том, как расположить контроллеры представления в моем приложении, где у меня все еще есть постоянный фон вместе с несколькими фоновыми анимациями

Вот как это настроено в настоящее время:

  • 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;
}

`

Все время слой спрайта виден на заднем плане, содержащий различные анимации. Проблема в том, что теперь я пытаюсь реализовать авторизацию и испытываю трудности, потому что представления в слое спрайтов не находятся внутри UIViewController.

Я думаю, что одной из возможностей является сделать подкласс SpriteLayer UIViewController, но не помещать его в контроллер навигации; он просто будет существовать за любым видом, который отображает навигационный контроллер. Я не знаю, будет ли иметь два контроллера представления одновременно, как это, источник ошибок или просто плохой дизайн, поскольку я прочитал на StackOverflow, что это не предназначенный дизайн контроллеров представления.

Есть мнения здесь?

Ура, Рич

P.S. У меня проблемы с размещением объективного метода C в блоке кода. Обратный тик, кажется, не работает, так как единственная часть кода, которая заканчивается шрифтом кода, - это та, которая имеет отступ. Кто-нибудь знает правильный способ сделать это? Еще раз спасибо.

Ответы [ 2 ]

5 голосов
/ 14 ноября 2010

Бентфорд, я не думал добавлять представление 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 и poof. У меня есть авторазмер фона + спрайты, которые не вылетают, когда контроллер представления помещается в стек навигации.

Спасибо за ваши предложения!

0 голосов
/ 14 ноября 2010

Не используйте несколько контроллеров представления.Вместо этого, используйте 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.

...