Неправильный кадр в parentVC и childVC после возврата в parentVC

У меня возникла проблема, когда мои кадры представлений были совершенно неправильными после возврата к viewController путем извлечения текущего.

Моя иерархия представлений выглядит следующим образом:

UITabbarController,
    UINavigationController
        HomeSwipeViewController (need as I cant put a UIPageViewController straight into a navController)
            UIPageViewController
                 HomeViewController

В HomeSwipeViewController у меня есть pageViewController, встроенный в containerView, containerView имеет ограничения и должен быть заполнен до супер (установлен в раскадровке):

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

[self.containerView addSubview:self.pageController.view];
[self addChildViewController:self.pageController];
[self.pageController didMoveToParentViewController:self];

[self.pageController.view addFullScreenConstraint]; // full to superView

Внутри homeViewController находится collectionView, на который вы можете нажать, и я нажимаю ViewController на UINavigationController. Это работает нормально, но когда я возвращаюсь к HomeSwipeViewController, все кадры неверны.

Журналы, распечатанные в viewDidAppear из homeSwipeViewController:

Сначала появляется:

[12234:152630] containerView: <UIView: 0x7fea0046cdb0; frame = (0 0; 320 464); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fea0046c450>>
[12234:152630] pageController.view: <_UIPageViewControllerContentView: 0x7fea0290b690; frame = (0 0; 320 464); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x7fea02909f60>>
[12234:152630] self.view: <UIView: 0x7fea0285d2d0; frame = (0 64; 320 504); autoresize = W+H; layer = <CALayer: 0x7fea0285d1d0>>

После поп:

[12234:152630] containerView: <UIView: 0x7fea0046cdb0; frame = (0 0; 0 0); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fea0046c450>>
[12234:152630] pageController.view: <_UIPageViewControllerContentView: 0x7fea0290b690; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x7fea02909f60>>
[12234:152630] self.view: <UIView: 0x7fea0285d2d0; frame = (0 64; 320 455); autoresize = W+H; layer = <CALayer: 0x7fea0285d1d0>>

Я пробовал вызывать setNeedsDisplay, setNeedsLayout и setNeedsUpdateConstraints в представленииDidAppear. Добавление ограничений программно в viewDidLayoutSubViews.

В консоли не регистрируются нарушенные ограничения.

Я считаю, что это связано с внедрением viewController, потому что, когда я удаляю UIPageViewController и добавляю homeViewContoller в качестве childViewController, происходят те же результаты.

Если ничего не вставлять, то проблем нет.

Все представления имеют translatesAutoresizingMaskIntoConstraints = NO


person BooRanger    schedule 23.01.2015    source источник


Ответы (1)


Я исправил это, установив ограничения для родительского контроллера представления (HomeSwipeViewController) в viewDidLayoutSubviews. Я использую это только тогда, когда self.view.translatesAutoresizingMaskIntoConstraints = YES;

Я думаю, это связано с тем, что в проекте используются как представления, которые были преобразованы в Autolayout, так и представления на основе фреймов (автоматическое изменение размера). Это похоже на то, как если бы вы подтолкнули VC с представлением, у которого нет автомакета, он удаляет VC из-за ограничений или, может быть, просто деактивирует механизм автоматического макета.

- (void)viewDidLayoutSubviews {

    if (self.view.superview) {

        self.view.translatesAutoresizingMaskIntoConstraints = NO;

        [self.view.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view]|" options:kNilOptions metrics:nil views:@{@"view": self.view}]];
        [self.view.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-64-[view]|" options:kNilOptions metrics:nil views:@{@"view":self.view}]];

    }

    [super viewDidLayoutSubviews];
}  

Любое понимание того, почему это работает, было бы круто!

person BooRanger    schedule 26.01.2015