8

Mam aplikację, która ma widok centralny z dwoma widokami z każdej strony. Chcę mieć dwa przyciski paska nawigacji, lewy i prawy, które naciskają nowy kontroler nawigacyjny na widok z lewej lub prawej strony.Sterownik iPhone Pushing View w lewym kierunku

Po zmianie widoku poprzez naciśnięcie nowego widoku za pomocą metody pushviewController: NavigationController, widok wydaje się być przesuwany z prawej strony. jak to zmienić, aby przesunąć się z lewej strony?

Odpowiedz

8

Zamiast korzystać z kontrolera nawigacyjnego, po prostu przesunąłbym widok.

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

więc załaduj kontroler widoku w normalny sposób, a następnie załóż uchwyt na widok, a następnie go przesuń? musiałbym również ręcznie zmienić przyciski paska nawigacji, jak również –

+0

Prawo. Załaduj kontroler widoku jak zwykle i przenieś currentView z ekranu i przenieś newView do. –

+0

to działa (musisz zastąpić - = z a = =), aby przesuwać się od lewej. oznacza to jednak ręczne wykonanie wszystkich przycisków w tył i w przód dla każdego widoku. co za ból. –

4

Nie sądzę, że można wyraźnie określić kierunek przesuwania w UINavigationControllers. To, co możesz zrobić, to otworzyć bieżący widok ze stosu nawigacji, aby wyświetlić poprzedni widok, który będzie animowany w pożądany sposób. Jednak może to być skomplikowane, jeśli chcesz mieć różne kontrolery widoku w zależności od tego, co robisz w bieżącym widoku.

Jeśli przepływ pracy nie jest zbyt skomplikowany, można zachować odniesienie do poprzedniego kontrolera widoku w bieżącym kontrolerze widoku w zależności od tego, co robisz w bieżącym widoku (jak wybrać komórkę widoku tabeli), można zmienić cokolwiek dane potrzebne do wcześniejszego widoku kontrolera, a następnie zadzwonić

[self.navigationController popViewController]; 

lub cokolwiek poprawna metoda jest (myślę to prawie jak to jest). to pozwoliłoby ci przejść w dół stosu nav z żądaną animacją, która działa, jeśli twój stos nav ma określoną liczbę widoków na nim.

0

Aby uzyskać przycisk typu "spiczasty", należy użyć innej metody.

W swojej 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

Zrobiłem zmiany kierunku animacji kiedy naciskać viewcontroller. możesz zmienić typ animacji tutaj [zestaw animacjiSypp: 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

Sprawia, że ​​poprzedni widok kontrolera jest czarny, to jest złe. –

0

Można odziedziczyć RTLNavigationController: UINavigationController i zastąpić te funkcje.

- (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]; 
} 

i

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

I delegata aplikacji:

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]; 

Pushing będzie od lewej do prawej i pojawiały się od prawej do lewej

3

co Reed Olsen powiedział: możesz podłączyć tylko jeden przycisk, który uruchamia suwak do tej samej metody i dodać BOOL, który śledzi, jeśli t widok jest pokazany lub nie. wszystko, co musisz zrobić, to właściwie ustawić pochodzenie.

- (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]; 
} 
Powiązane problemy