2011-12-11 141 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]; 
    }]; 
}