从右到左UINavigationController
我一直使用UINavigationController与UITableView控制器一起实现我的应用程序的分层导航。
不幸的是用户界面是用希伯来语,所以一切都必须从右到左才有意义。
真正的问题是导航控制器,滑动animation方向和后退button的位置。
到目前为止,我还没有find任何优雅的解决scheme,取得了一些有限的成功,重写popup和推动方法之间创build转换之间的意见,如下所示: 如何更改推动和stream行animation在基于导航的应用程序
但这是一个非常有限的解决scheme,它看起来不正确。
你有什么build议吗? 我真的必须用新的东西重写/复制导航控制器吗? 如果是这样,你会build议inheritanceUINavigationController或UIViewController?
如果你愿意付出一点努力,你可以使用UINavigationController的替代品,比如FJTransitionController https://github.com/coreyfloyd/FJSTransitionController 。 它可以作为导航或标签控制器的插入式,可定制的replace,以及任何其他导航行为,你可以想要的。 您将需要自行提供UI,但现有的UINavigationBar可能是可用的。
这是一个非常偷偷摸摸的方法,我编码在本周末用于我的应用程序。 把这段代码放在活动视图控制器(即表格视图)中,该控制器想要从右到左的过渡过程中伪“推”一个新的视图控制器。 准备新的ViewController,然后调用它。 与标准从左到右过渡略有不同的是,标题栏不生成animation,而是在之后进行交换。 你“借用”新的视图控制器,使其成为活动视图控制器的子元素足够长的时间来完成animation,然后把它们放回原处。 Apple对UINavigationController规则非常具体,实际上对这里的顺序的任何改变或者推送和popup逻辑都会抛出一个exception,所以有相当多的尝试和错误。
-(void) showVC:(UIViewController *) nextVC rightToLeft:(BOOL) rightToLeft { [self addChildViewController:neighbor]; CGRect offscreenFrame = self.view.frame; if(rightToLeft) { offscreenFrame.origin.x = offscreenFrame.size.width * -1.0; } else if(direction == MyClimbDirectionRight) { offscreenFrame.origin.x = offscreenFrame.size.width; } [[neighbor view] setFrame:offscreenFrame]; [self.view addSubview:[neighbor view]]; [neighbor didMoveToParentViewController:self]; [UIView animateWithDuration:0.5 animations:^{ [[neighbor view] setFrame:self.view.frame]; } completion:^(BOOL finished){ [neighbor willMoveToParentViewController:nil]; [neighbor.view removeFromSuperview]; [neighbor removeFromParentViewController]; [[self navigationController] pushViewController:neighbor animated:NO]; NSMutableArray *newStack = [[[self navigationController] viewControllers] mutableCopy]; [newStack removeObjectAtIndex:1]; //self, just below top [[self navigationController] setViewControllers:newStack]; }]; }