0

現在のフレームをポップしてviewControllerに戻った後、ビューフレームが完全に間違っているという問題がありました。

私のビュー階層は次のとおりです。

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

HomeSwipeViewController には、containerView に pageViewController が埋め込まれています。

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 ですべてプログラムによって制約を追加します。

壊れた制約はコンソールに記録されません。

UIPageViewController を削除して homeViewContoller を childViewController として追加すると、同じ結果が発生するため、viewController の埋め込みに関係していると思います。

何も埋め込まなくても問題ありません。

すべてのビューには translatesAutoresizingMaskIntoConstraints = NO があります

4

1 に答える 1

0

viewDidLayoutSubviews で親ビュー コントローラー (HomeSwipeViewController) の制約を設定することで、これを修正しました。私は self.view.translatesAutoresizingMaskIntoConstraints = YES; の場合にのみ do it を使用します。

これは、プロジェクトが 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];
}  

なぜこれが機能するのかについての洞察は素晴らしいでしょう!

于 2015-01-26T10:05:17.133 に答える