8

У меня есть приложение, которое имеет центральное представление с двумя видами с каждой стороны. Я хочу иметь две кнопки панели навигации слева и справа, которые наводят новый навигационный контроллер на вид слева или справа.iPhone Pushing View Controller в левом направлении

Когда вы меняете представления, нажимая новое представление с помощью метода navigationViewController: NavigationController, открывается видимое изображение справа. как мне изменить это, чтобы скользить слева?

ответ

8

Вместо использования контроллера навигации я бы просто переместил вид.

CGRect inFrame = [currentView frame]; 
CGRect outFrame = firstFrame; 
outFrame.origin.x -= inFrame.size.width; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:1.0]; 

[newView setFrame:inFrame]; 
currentView setFrame:outFrame]; 

[UIView commitAnimations]; 
+0

так загрузите контроллер вида в нормальном режиме, затем получите ручку на вид, а затем переместите ее? я также должен вручную изменить кнопки панели навигации, а также –

+0

Вправо. Загрузите контроллер вида как обычно и переместите currentView с экрана и переместите newView в. –

+0

это работает (вам нужно заменить - = на + =), чтобы сместить его слева. однако это означает, что вручную все кнопки назад и вперед для каждого вида. Вот это боль. –

4

Я не думаю, что вы можете явно определять направление скольжения в UINavigationControllers. То, что вы могли бы сделать, - вывести текущее представление из стека навигации, чтобы показать предыдущее представление, которое будет анимироваться так, как вы хотите. Однако это может быть сложно, если вы хотите, чтобы разные диспетчеры отображались в зависимости от того, что вы делаете в текущем представлении.

Если ваш рабочий процесс не слишком сложный, вы можете сохранить ссылку на контроллер предыдущего вида в текущем контроллере. в зависимости от того, что вы делаете на текущем виде (например, выбрать вид ячейку таблицы), вы можете изменить любые данные, необходимые в предыдущем контроллере представления, а затем вызвать

[self.navigationController popViewController]; 

или любой правильный метод (я думаю, это довольно близко к тому, как это). что позволит вам перемещаться вниз по стеку с нужной анимацией, которая работает, если ваш стек nav имеет определенное количество просмотров на нем.

0

Чтобы получить кнопку «pointy», вам нужно использовать другой метод.

В вашем AppDelegate:

UITableViewController *first = [[RootViewController alloc] initWithStyle:UITableViewStylePlain]; 
UITableViewController *second = [[SomeOtherViewController alloc] initWithStyle:UITableViewStylePlain]; 

NSArray *stack = [NSArray arrayWithObjects: first, second, nil]; 

UINavigationController *nav = [[UINavigationController alloc] init]; 
[nav setViewControllers:stack animated:NO]; 
9

Я сделал изменения направления анимации, когда мы нажимаем ViewController. вы можете изменить тип анимации здесь [анимация setSubtype: kCATransitionFromRight];

ViewController *elementController = [[ViewController alloc] init]; 

// set the element for the controller 
ViewController.element = element; 


// push the element view controller onto the navigation stack to display it 

CATransition *animation = [CATransition animation]; 
[[self navigationController] pushViewController:elementController animated:NO]; 
[animation setDuration:0.45]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromRight]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]]; 
[[elementController.view layer] addAnimation:animation forKey:@"SwitchToView1"]; 

[elementController release]; 
+1

Он делает предыдущий контроллер контроллера черным, это плохая вещь. –

0

Вы можете наследовать RTLNavigationController: UINavigationController и перезаписать эти функции.

- (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    DummyViewController*dvc = [[DummyViewController alloc] init]; 
    [super pushViewController:viewController animated:NO]; 
    [super pushViewController:dvc animated:NO]; 
    [dvc release]; 
    [super popViewControllerAnimated:YES]; 
} 

и

- (UIViewController *)popViewControllerAnimated:(BOOL)animated 
{ 
UIViewController *firstViewController = [super popViewControllerAnimated:NO]; 
UIViewController *viewController = [super popViewControllerAnimated:NO]; 
[super pushViewController:viewController animated:animated]; 
return firstViewController; 
} 

И в заявке делегата:

navCon = [[RTLNavigationController alloc] init]; 

rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil]; 
rootViewController.contextDelegate = self; 

DummyViewController *dvc = [[DummyViewController alloc]init]; 
[navCon pushViewController:dvc animated:NO]; 
[dvc release]; 

[navCon pushViewController:rootViewController animated:NO]; 
[self.window addSubview:navCon.view]; 

Нажатие будет слева направо и выскакивают справа налево

3

к тому, что сказал Рид Олсен: вы должны подключить только одну кнопку, которая запускает слайд вверх до того же метода и добавляет BOOL, который отслеживает, если t он отображается или нет. все, что вам нужно сделать, это правильно установить источник.

- (IBAction)slideMenuView 
{ 
    CGRect inFrame = [self.view frame]; 
    CGRect outFrame = self.view.frame; 

    if (self.viewisHidden) { 
    outFrame.origin.x += inFrame.size.width-50; 
    self.viewisHidden = NO; 
    } else { 
    outFrame.origin.x -= inFrame.size.width-50; 
    self.viewisHidden = YES; 
    } 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [self.menuView setFrame:inFrame]; 
    [self.view setFrame:outFrame]; 
    [UIView commitAnimations]; 
} 
Смежные вопросы