Frage

Ich habe eine App, die eine mittlere Ansicht mit zwei Ansichten auf jeder Seite hat. Ich möchte zwei Navigationsleistenknöpfe links und rechts haben, die einen neuen Navigationscontroller von links oder rechts auf die Ansicht drücken.

Wenn Sie die Ansichten ändern, indem Sie eine neue Ansicht mithilfe des PushViewController: Methode of NavigationController drücken, wird die Ansicht von rechts eingeschoben. Wie ändere ich das, um von links einzusteigen?

War es hilfreich?

Lösung

Anstatt einen Navigationscontroller zu verwenden, bewegen ich einfach die Ansicht.

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

Andere Tipps

Ich habe die Animationsrichtung geändert, wenn wir ViewController drücken. Sie können hier den Animationstyp ändern Animation setSuBype: 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];

Ich glaube nicht, dass Sie ausdrücklich die Gleitrichtung in UinavigationControllern definieren können. Was Sie möglicherweise tun können, ist die aktuelle Ansicht aus dem Navigationsstapel zu streichen, um die vorherige Ansicht anzuzeigen, die in der gewünschten Art und Weise animieren würde. Dies kann jedoch komplex sein, wenn Sie unterschiedliche Ansichtscontroller ansehen möchten, je nachdem, was Sie in der aktuellen Ansicht tun.

Wenn Ihr Workflow nicht zu kompliziert ist, können Sie einen Verweis auf den vorherigen Ansichtscontroller im aktuellen Ansichtscontroller enthalten. Je nachdem, was Sie in der aktuellen Ansicht tun (z. B. eine Tabellenansichtszelle auswählen) können Sie alle Daten ändern, die Sie im vorherigen Ansichtsregler benötigen, und dann aufrufen

[self.navigationController popViewController];

Oder was auch immer die richtige Methode ist (ich denke, das ist ziemlich nahe daran, wie es ist). Auf diese Weise können Sie mit der gewünschten Animation den Navigationsstapel hinunterziehen, was funktioniert, wenn Ihr NAV -Stack eine festgelegte Anzahl von Ansichten hat.

Zu dem, was Reed Olsen sagte: Sie müssen nur eine Taste anschließen, damit die Rutsche auf dieselbe Methode startet und einen Bool hinzufügen, der verfolgt, wenn die Ansicht angezeigt wird oder nicht. Alles, was Sie tun müssen, ist den Ursprung ordnungsgemäß einzustellen.

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

Um die Schaltfläche "pointy" -Typ zu erhalten, müssen Sie eine andere Methode verwenden.

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

Sie können rtlnavigationController erben: UinAvigationController und überschreiben diese Funktionen.

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

und

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

Und in Anwendungsdelegierter:

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

Das Schieben wird von links nach rechts sein und von rechts nach links auftauchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top