Справа налево UINavigationController
Я использовал UINavigationController вместе с контроллерами UITableView для реализации иерархической навигации в моем приложении.
К сожалению, пользовательский интерфейс на иврите, поэтому все должно быть справа налево, чтобы иметь смысл.
Настоящая проблема - это навигационный контроллер, направление анимации слайдов и положение кнопки "Назад".
До сих пор я не нашел ни одного элегантного решения, имел некоторый ограниченный успех с переопределением методов pop и push, создающих переход между представлениями, как предлагается здесь: Как изменить анимацию Push и Pop в приложении на основе навигации
Но это очень ограниченное решение, и оно не выглядит правильным.
У вас есть какие-нибудь предложения? Мне действительно нужно переписывать / копировать навигационный контроллер чем-то новым? Если это так, вы бы предложили наследовать UINavigationController или UIViewController?
2 ответа
Если вы хотите немного поработать, вы можете использовать замену для UINavigationController, например FJTransitionController https://github.com/coreyfloyd/FJSTransitionController. Он функционирует как вставная, настраиваемая замена для контроллеров навигации или вкладок, а также любого другого поведения навигации, которое вы можете захотеть. Вам нужно будет предоставить пользовательский интерфейс самостоятельно, хотя существующий UINavigationBar может быть использован.
Вот очень хитрый подход, который я написал в эти выходные для использования в своем приложении. Поместите этот код в активный контроллер представления (то есть в табличное представление), который хочет псевдо-"выдвинуть" новый контроллер представления с переходом справа налево. Подготовьте новый 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];
}];
}