2013-02-24 7 views
8

У меня есть приложение с одним взглядом и вы хотите показать новый ViewController при нажатии кнопки панели навигации в правой части. Я называю это VC этим кодом:presentViewController анимация со стороны

- (IBAction)createEntryButton:(id)sender { 
    CreateEntryViewController *vc2 = [[CreateEntryViewController alloc] init]; 
    [self presentViewController:vc2 animated:TRUE completion:nil]; 
} 

Эта анимация, однако, приносит vc2 из нижней, которая кажется нелогичным по моему UI. Так что я задал себе вопрос:

Как я могу сделать свой vc2 справа, а не внизу с помощью presentViewController?

Спасибо.

ответ

9

чистейшая будет использовать navigationController для толкания и выскакивают взгляды ..

если вы уже в NavigationController

[self.navigationCtroller pushViewController:vc2 animated:TRUE completion:nil] 

, если у вас нет, адаптировать код, где ваш контроллер представления добавляется в окно. Если VC является rootWindowController и вы не используете раскадровки, это, вероятно, в вашем AppDelegate

при использовании раскадровки, адаптировать раскадровки, так что вы находитесь внутри навигационного контроллера


ELSE, если вы не» t хотите, чтобы по какой-либо причине: :) просто вручную анимация в представлении 2. VC с использованием [UIView animate: vc2.view ....]

написанные inline - имена методов не совпадают, но показывают общий подход:

UIView *v = vc2.view; 
CGRect f = v.frame; 
f.origin.x += self.view.frame.size.width; //move to right 

v.frame = f; 

[UIView animateWithDuration:0.5 animations:^{ 
    v.frame = self.view.frame; 
} completion:^(BOOL finished) { 
    [self presentViewController:vc2 animated:NO completion:nil]; 
}]; 

в блоке завершения присутствовавшие вид контроллер VC2 не анимированный, как вы уже делали это сами

+0

навигационный контроллер не должен показывать панель навигации кстати :) –

+0

Теперь я вызываю 'vc2' со следующим: AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; CreateEntryViewController * vc2 = [[CreateEntryViewController alloc] init]; [appDelegate.navController pushViewController: vc2 animated: TRUE]; Но я не могу вернуться с тем, что, как я думал, будет правильным: AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; [appDelegate.navController rejectViewControllerAnimated: TRUE завершение: nil]; Любые мысли? –

+0

Да, вы не хотите вызывать vc2 с appDelegate - thats .... weird - вызывать его с помощью вашего навигационного контроллера OWN. [тот, который содержит vc1] (vc1.navigationController) –

0

Это помогло мне,

- (void)presentNewViewController{ 
    NewViewController *objNewViewController =[[NewViewController alloc]initWithNibName:@"NewViewController" bundle:nil]; 

    UIView *tempNewVCView = [UIView new]; 
    tempNewVCView = objNewViewController.view; 
    tempNewVCView.frame = self.view.frame; 

    CGRect initialFrame = self.view.frame; 
    initialFrame.origin.x = self.view.frame.size.width; 

    tempNewVCView.frame = initialFrame; 

    [self.view addSubview:tempNewVCView]; 

    [UIView animateWithDuration:0.3 animations:^{ 
     tempNewVCView.frame = self.view.frame; 
    } completion:^(BOOL finished) { 
     [self presentViewController:objNewViewController animated:NO completion:^{ 
     }]; 
    }]; 
} 
Смежные вопросы