Краткая версия:
У меня возникла проблема с руководством по компоновке верхнего макета при использовании в сочетании с пользовательским переходом и UINavigationController
в iOS7. В частности, ограничение между верхним макетом и текстом не выполняется. Кто-нибудь столкнулся с этой проблемой?
Длинная версия:
У меня есть сцена, которая однозначно определяет ограничения (т.е. верхний, нижний, левый и правый), который отображает вид следующим образом:
Но когда я использую это с настраиваемым переходом на контроллере навигации, верхнее ограничение в верхнем руководстве по расположению кажется выключенным, и оно отображается следующим образом, как если бы верхний макет был наверху экрана, а не в нижней части навигационного контроллера:
Похоже, что "руководство по верстке" с контроллером навигации путается при использовании настраиваемого перехода. Остальные ограничения применяются правильно. И если я поверну устройство и поверну его снова, все будет внезапно отображаться правильно, поэтому не кажется, что ограничения не определены должным образом. Аналогично, когда я выключаю свой пользовательский переход, представления отображаются правильно.
Сказав, что _autolayoutTrace
сообщает, что объекты UILayoutGuide
страдают от AMBIGUOUS LAYOUT
, когда я запускаю:
(lldb) po [[UIWindow keyWindow] _autolayoutTrace]
Но эти руководства по макетам всегда сообщаются как неоднозначные, когда я смотрю на них, хотя я гарантировал отсутствие отсутствующих ограничений (я сделал обычный выбор контроллера вида и выбрав "Добавить недостающие ограничения для контроллера вида", или выбрать все элементы управления и сделать то же самое для них).
В терминах того, насколько точно я делаю переход, я указал объект, который соответствует UIViewControllerAnimatedTransitioning
в методе animationControllerForOperation
:
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
if (operation == UINavigationControllerOperationPush)
return [[PushAnimator alloc] init];
return nil;
}
и
@implementation PushAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.5;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
[[transitionContext containerView] addSubview:toViewController.view];
CGFloat width = fromViewController.view.frame.size.width;
toViewController.view.transform = CGAffineTransformMakeTranslation(width, 0);
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
fromViewController.view.transform = CGAffineTransformMakeTranslation(-width / 2.0, 0);
toViewController.view.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
fromViewController.view.transform = CGAffineTransformIdentity;
[transitionContext completeTransition:![transitionContext transitionWasCancelled]];
}];
}
@end
Я также выполнил описанное выше, установив frame
представления, а не transform
, с тем же результатом.
Я также попытался вручную убедиться, что ограничения повторно применяются, вызвав layoutIfNeeded
. Я также пробовал setNeedsUpdateConstraints
, setNeedsLayout
и т.д.
В нижней строке, кто-нибудь успешно женился на пользовательском переходе контроллера навигации с ограничениями, использующими руководство по началу размещения?