Я реализовал пользовательский переход UIViewController в моем приложении, который заменяет контроллеры навигации, созданные в push-анимации.
Все работает до сих пор, за исключением того, что toplayoutguide в контроллере нового толкаемого изображения равен 0, хотя новый контроллер представления унаследовал навигационную панель от старого контроллера представлений. Он должен быть 64.0 (высота панели управления + высота панели навигации), где сейчас 0.0. Таким образом, все объекты, которые прикреплены к верхней направляющей макета в раскадровке, теперь выглядят на 64 очка слишком высокими (ниже полупрозрачной панели).
Когда я отключу пользовательский переход View, верхнее руководство по макету будет иметь ожидаемое значение. Я попытался вызвать layoutSubviews и updateConstraints "повсюду". В контроллере представления, а также в навигационном контроллере.
Насколько я понимаю, диспетчер навигации (parentviewcontroller) должен обновить toplayoutguide нового контроллера представлений, но, видимо, мне не хватает чего-то в моем настраиваемом коде перехода, который запускает обновление до правильного значения для toplayoutguide.
Здесь мой пользовательский код перехода, который является объектом, установленным как делегат навигационного контроллера:
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.7;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *animationContainerView = [transitionContext containerView];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = [toVC view];
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *fromView = [fromVC view];
CGRect endFrame = [transitionContext finalFrameForViewController:toVC];
CGRect startFrame;
startFrame = CGRectOffset(endFrame, 0, endFrame.size.height);
if (self.operation == UINavigationControllerOperationPop) {
[animationContainerView insertSubview:toView belowSubview:fromView];
[toView setFrame:endFrame];
}
else{
[toView setFrame:startFrame];
[animationContainerView insertSubview:toView aboveSubview:fromView];
}
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.8 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
if (self.operation == UINavigationControllerOperationPop) {
[fromView setFrame:startFrame];
[fromView layoutIfNeeded];
}
else{
[toView setFrame:endFrame];
[toView layoutIfNeeded];
}
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
Ничего необычного там не бывает. Только вид скользит снизу вверх с некоторой встроенной динамикой.
Проблема заключается в том, что объекты, прикрепленные к верхнему руководству по макету, теперь находятся под панелью навигации, так как длина верхнего направляющего макета == 0.
Я не могу понять, что мне нужно сделать, так что контроллер воспроизведения toplayoutguide установлен на правильное значение.
Навигационная навигация выполняется "plain vanilla" с помощью раскадровки. Все, что я делаю, перед вызовом функции performSegueWithIdentifier - это настроить делегацию диспетчеров навигации.
Здесь код:
self.navigationController.delegate = [[My_CustomNavigationTransitionDelegate alloc] init];
[self performSegueWithIdentifier:@"infosSegue" sender:nil];
Что мне не хватает?