Справа налево UINavigationController - PullRequest
1 голос
/ 12 декабря 2011

Я использовал UINavigationController вместе с контроллерами UITableView для реализации иерархической навигации в моем приложении.

К сожалению, пользовательский интерфейс на иврите, поэтому все должно быть справа налево, чтобы иметь смысл.

Настоящая проблема - это навигационный контроллер, направление анимации слайдов и положение кнопки возврата.

До сих пор я не нашел ни одного элегантного решения, имел некоторый ограниченный успех с переопределением методов pop и push, создающих переход между представлениями, как предлагается здесь: Как изменить анимацию Push и Pop в навигационном приложении

Но это очень ограниченное решение, и оно не выглядит правильным.

У вас есть предложения? Мне действительно нужно переписывать / копировать навигационный контроллер чем-то новым? Если это так, вы бы предложили наследовать UINavigationController или UIViewController?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Если вы хотите немного поработать, вы можете использовать замену для UINavigationController, такую ​​как FJTransitionController https://github.com/coreyfloyd/FJSTransitionController. Он функционирует в качестве вставной настраиваемой замены для контроллеров навигации или вкладок в виде как и любое другое навигационное поведение, которое вы можете захотеть. Вам нужно будет предоставить пользовательский интерфейс самостоятельно, хотя существующий UINavigationBar может быть использован.

0 голосов
/ 09 июня 2013

Вот очень хитрый подход, который я написал в эти выходные для использования в своем приложении.Поместите этот код в активный контроллер представления (т. Е. Табличное представление), который хочет псевдо - «выдвинуть» новый контроллер представления с переходом справа налево.Подготовьте новый 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];
    }];
}
...