iPhone向左推送视图控制器

8

我有一个应用程序,其中心视图有两个侧面视图。我想要左右两个导航栏按钮,它们可以从左侧或右侧向视图推入新的导航控制器。

当您使用NavigationController的pushviewController:方法通过推入新视图来更改视图时,该视图似乎从右侧滑入。如何更改为从左侧滑入?

6个回答

9

当我们推出视图控制器时,我已经改变了动画方向。您可以在此处更改动画类型 [animation 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
它会使之前的视图控制器变黑,这是不好的事情。 - Chanchal Raj

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

所以正常加载视图控制器,然后获取视图的句柄,然后移动它?我还需要手动更改导航栏按钮。 - Aran Mulholland
好的。像平常一样加载视图控制器,将 currentView 移出屏幕并将 newView 移入。 - Reed Olsen
这个可以工作(你必须用 += 替换 -=)从左边滑入。但是这意味着要为每个视图手动执行所有的返回和前进按钮。真是太痛苦了。 - Aran Mulholland
有没有任何想法如何样式化按钮,使它们成为通常在导航中使用的“尖角”类型?(返回按钮) - Aran Mulholland
除了使用导航控制器或自己的图像,我还没有找到获取导航控制器指向按钮的方法。 - aiham

4
我认为在UINavigationControllers中无法明确定义滑动方向。你可以尝试从导航栈中弹出当前视图以显示先前的视图,这样会以你想要的方式进行动画。然而,如果你希望根据当前视图上的操作来显示不同的视图控制器,则可能会更加复杂。
如果你的工作流程不太复杂,你可以在当前视图控制器中保存对先前视图控制器的引用。根据你在当前视图上的操作(例如选择表格视图单元格),你可以更改先前视图控制器中所需的任何数据,然后调用...
[self.navigationController popViewController];

或者采用正确的方法(我认为这个方法非常接近)。这将允许您使用所需的动画向下移动导航栏堆栈,仅在导航栏堆栈上有一组视图时才有效。


3

根据Reed Olsen的说法:您只需要连接一个按钮,该按钮启动向同一方法的幻灯片上滑,并添加一个跟踪视图是否显示的BOOL。所有您需要做的就是正确设置原点。

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

0
要获得“尖角”类型的按钮,您需要使用不同的方法。
在您的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];

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

推入操作将从左到右进行,弹出操作将从右到左进行


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接