2011-12-11 140 views
1

我已经使用UINavigationController和UITableView控制器一起在我的应用程序上实现分层导航。从右到左UINavigationController

不幸的是用户界面是用希伯来语写的,所以一切都必须从右到左才有意义。

真正的问题是导航控制器,滑动动画方向和后退按钮位置。

我还没有找到任何优雅的解决方案,到目前为止,已经有覆盖弹出一些有限的成功,推动创建视图之间的过渡方法的建议在这里: How to change the Push and Pop animations in a navigation based app

但它是非常有限的解决方案,它不看起来不错。

你有什么建议吗? 我真的不得不用新的东西重写/复制导航控制器吗? 如果是的话,你会建议继承UINavigationController还是UIViewController?

回答

1

如果您愿意付出一点努力,您可以使用UINavigationController的替代品,例如FJTransitionController https://github.com/coreyfloyd/FJSTransitionController。它可以作为导航或选项卡控制器的插入式,可定制替换,以及任何其他可能需要的导航行为。您将需要自行提供UI,但现有的UINavigationBar可能可用。

+2

谢谢,虽然它不完全是最优雅的解决方案(我希望苹果只会在他们的用户界面上支持双向)。您的解决方案的确为那些希望替换标准UINavigtionController的人节省了时间。 我最终做的是继承UINavigtionController并重写push和pop方法,使用不带动画的另一个“假”控制器并用动画弹出它(导致反向推动画)的技巧,我还在左边使用了自定义NavigationItems,右侧复制后退按钮。 – Barak

0

这是一个非常偷偷摸摸的方法,我编码在本周末用于我的应用程序。把这段代码放到活动视图控制器(即表格视图)中,该控制器想要用右向左转换伪“推”新的视图控制器。准备新的ViewController然后调用它。 与标准从左到右过渡略有不同的是,标题栏不生成动画,它在之后交换。 您“借用”了新的视图控制器,并使其成为活动视图控制器的孩子足够长的时间来完成动画,然后将它们放回原样。 Apple对UINavigationController规则非常具体,实际上对订单的任何更改或推送和弹出逻辑都会引发异常,所以有相当数量的试验和错误。

-(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]; 
    }]; 
} 
相关问题