UIViewAnimation сделанный UIViewController, принадлежащим UINavigationController? - PullRequest
1 голос
/ 10 апреля 2010

У меня есть UINavigationController, с которым пользователь перемещается. При вставке определенного UIViewController в стек навигации на панели навигации появляется кнопка «Настройки». Когда пользователь нажимает эту кнопку, я бы хотел перевернуть текущий вид / контроллер, то есть все на экране, включая панель навигации, в представление настроек.

Итак, у меня есть SettingsViewController, к которому я хотел бы перейти из моего CurrentViewController, который находится в стеке navigationController.

Я получаю все виды странного поведения, пытаясь это сделать, UIViews, принадлежащие SettingsViewController, начнут анимироваться, скользя на место, навигационные кнопки перемещаются, ничто не действует так, как я думаю.

-(void)settingsHandler {

    SettingViewController *settingsView = [[SettingViewController alloc] init];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
                           forView:self.navigationController.view
                            cache:YES];

    [self.navigationController.view addSubview:settingsView.view];

    [UIView commitAnimations];

}

Вышеуказанное приводит к тому, что представления корректно переворачиваются, но все подпредставления SettingsViewController располагаются в (0, 0) и после перехода они «защелкиваются» на месте?

Это потому, что я создаю и добавляю свои подпредставления в viewDidLoad, как это?

- (void)viewDidLoad {

    UIImageView *imageBg = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];
    [imageBg setImage:[UIImage imageNamed:@"background.png"]];
    [self.view addSubview:imageBg];
    [imageBg release];

    SettingsSubview *switchView = [[SettingsSubview alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];
    [self.view addSubview:switchView];
    [switchView release];
    [super viewDidLoad];
}

1: Как правильно выполнить переход «перевернуть», из UIViewController в UINavigationController, в новый UIViewController, а затем из нового UIViewController и обратно в «оригинальный» UIViewController, находящийся в стеке UINavigationControllers

2: Должен ли я использовать другой подход, чем метод "viewDidLoad", при создании экземпляра и добавлении подпредставлений в UIViewController?

- вопрос 2 - это скорее «лучшая практика». Я видел разные способы делать это, и у меня возникают проблемы с поиском или пониманием документации жизненного цикла и различных тем и сообщений на эту тему. Я пропускаю примеры "лучших практик".

Большое спасибо за предоставленную помощь:)

1 Ответ

3 голосов
/ 11 апреля 2010

Если вы хотите создать иерархию представлений программным способом, вам нужно сделать это в -loadView. Для этого вы должны создать представление самостоятельно, добавить все его подпредставления, а затем назначить его свойству представления, например:

- (void)loadView {
    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];

    UIImageView *imageBg = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];
    [imageBg setImage:[UIImage imageNamed:@"background.png"]];
    [containerView addSubview:imageBg];
    [imageBg release];

    SettingsSubview *switchView = [[SettingsSubview alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];
    [containerView addSubview:switchView];
    [switchView release];

    self.view = containerView;
    [containerView release];
}

Это помогает понять контекст, в котором вызывается этот метод, и как он ведет себя по умолчанию. При первом обращении к свойству view UIViewController метод getter по умолчанию вызывает -loadView для отложенной загрузки представления. Реализация -loadView по умолчанию загружает представление из кончика, если он был указан. В противном случае он создает простой объект UIView и устанавливает его как представление контроллера. Переопределив этот метод, вы можете гарантировать, что иерархия вашего представления будет полностью сформирована при первом обращении к нему.

-viewDidLoad следует использовать для любой последующей установки, которая должна произойти после полной загрузки иерархии представления. Этот метод будет вызван независимо от того, загружено ли представление из кончика или программно сконструировано в loadView.

...