弹回 parentVC 后 parentVC 和 childVC 中的帧不正确

Posted

技术标签:

【中文标题】弹回 parentVC 后 parentVC 和 childVC 中的帧不正确【英文标题】:Frame incorrect in parentVC and childVC after popping back to parentVC 【发布时间】:2015-01-23 16:14:05 【问题描述】:

我遇到的问题是通过弹出当前视图返回 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 时,所有帧都不正确。

在 homeSwipeViewController 的 viewDidAppear 中打印出的日志:

首先出现:

[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>>

我尝试在 viewDidAppear 中调用 setNeedsDisplay、setNeedsLayout 和 setNeedsUpdateConstraints。在 viewDidLayoutSubViews 中以编程方式添加所有约束。

控制台中不会记录任何损坏的约束。

我相信这与嵌入 viewController 有关,因为当我删除 UIPageViewController 并将 homeViewContoller 添加为 childViewController 时,会发生相同的结果。

如果我没有嵌入任何内容,则没有问题。

所有视图都有 translatesAutoresizingMaskIntoConstraints = NO

【问题讨论】:

【参考方案1】:

我通过在 viewDidLayoutSubviews 中设置父视图控制器 (HomeSwipeViewController) 的约束来解决此问题。我只在 self.view.translatesAutoresizingMaskIntoConstraints = YES 时使用它;

我认为这是因为该项目同时使用了已现代化为自动布局的视图和基于框架(自动调整大小)的视图。看起来就像用没有自动布局的视图推送 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];
  

任何关于为什么这样做的见解都会很酷!

【讨论】:

以上是关于弹回 parentVC 后 parentVC 和 childVC 中的帧不正确的主要内容,如果未能解决你的问题,请参考以下文章

快照如何干扰父/子关系?

以编程方式进行segueing时检索ViewControllers堆栈

Swift:弹出视图控制器时如何传递数据

IOS弹出视图 LewPopupViewController

用于 2 个容器视图进行通信的 Swift 委托

[高项]应急计划vs弹回计划vs权变措施