Право налево UINavigationController

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

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

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

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

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

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

Ответ 1

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

Ответ 2

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