Der Inhalt liegt unterhalb der Navigationsleiste, wenn er in einen benutzerdefinierten Container View Controller eingebettet ist.

AKTUALISIEREN

Basierend auf Tims Antwort implementierte ich in jedem Ansichtscontroller, der eine Bildlaufansicht (oder Unterklasse) hatte, die Teil meines benutzerdefinierten Containers war, Folgendes:

- (void)didMoveToParentViewController:(UIViewController *)parent
{
    if (parent) {
        CGFloat top = parent.topLayoutGuide.length;
        CGFloat bottom = parent.bottomLayoutGuide.length;

        // this is the most important part here, because the first view controller added 
        // never had the layout issue, it was always the second. if we applied these
        // edge insets to the first view controller, then it would lay out incorrectly.
        // first detect if it's laid out correctly with the following condition, and if
        // not, manually make the adjustments since it seems like UIKit is failing to do so
        if (self.collectionView.contentInset.top != top) {
            UIEdgeInsets newInsets = UIEdgeInsetsMake(top, 0, bottom, 0);
            self.collectionView.contentInset = newInsets;
            self.collectionView.scrollIndicatorInsets = newInsets;
        }
    }

    [super didMoveToParentViewController:parent];
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ich habe einen benutzerdefinierten Container View Controller aufgerufenSegmentedPageViewController. Ich setze das alsUINavigationController's rootViewController.

Der Zweck vonSegmentedPageViewController ist ein zulassenUISegmentedControl, wird als titleView des NavControllers festgelegt, um zwischen verschiedenen untergeordneten View-Controllern zu wechseln.

Diese untergeordneten Ansichtscontroller enthalten entweder eine Bildlauf-, eine Tabellen- oder eine Sammlungsansicht.

Wir stellen fest, dass der erste Ansichts-Controller korrekt positioniert unterhalb der Navigationsleiste geladen wird. Wenn wir jedoch zu einem neuen Ansichtscontroller wechseln, wird die Navigationsleiste nicht beachtet und die Ansicht wird unter der Navigationsleiste festgelegt.

Wir verwenden Auto-Layout und Interface Builder. Wir haben alles versucht, was uns einfällt, können aber keine einheitliche Lösung finden.

Hier ist der Hauptcodeblock, der dafür verantwortlich ist, den ersten Ansichts-Controller festzulegen und zu einem anderen zu wechseln, wenn ein Benutzer auf das segmentierte Steuerelement tippt:

- (void)switchFromViewController:(UIViewController *)oldVC toViewController:(UIViewController *)newVC
{
    if (newVC == oldVC) return;

    // Check the newVC is non-nil otherwise expect a crash: NSInvalidArgumentException
    if (newVC) {

        // Set the new view controller frame (in this case to be the size of the available screen bounds)
        // Calulate any other frame animations here (e.g. for the oldVC)
        newVC.view.frame = self.view.bounds;

        // Check the oldVC is non-nil otherwise expect a crash: NSInvalidArgumentException
        if (oldVC) {
            // **** THIS RUNS WHEN A NEW VC IS SET ****
            // DIFFERENT FROM FIRST VC IN THAT WE TRANSITION INSTEAD OF JUST SETTING


            // Start both the view controller transitions
            [oldVC willMoveToParentViewController:nil];
            [self addChildViewController:newVC];

            // Swap the view controllers
            // No frame animations in this code but these would go in the animations block
            [self transitionFromViewController:oldVC
                              toViewController:newVC
                                      duration:0.25
                                       options:UIViewAnimationOptionLayoutSubviews
                                    animations:^{}
                                    completion:^(BOOL finished) {
                                        // Finish both the view controller transitions
                                        [oldVC removeFromParentViewController];
                                        [newVC didMoveToParentViewController:self];
                                        // Store a reference to the current controller
                                        self.currentViewController = newVC;
                                    }];
        } else {

            // **** THIS RUNS WHEN THE FIRST VC IS SET ****
            // JUST STANDARD VIEW CONTROLLER CONTAINMENT

            // Otherwise we are adding a view controller for the first time
            // Start the view controller transition
            [self addChildViewController:newVC];

            // Add the new view controller view to the view hierarchy
            [self.view addSubview:newVC.view];

            // End the view controller transition
            [newVC didMoveToParentViewController:self];

            // Store a reference to the current controller
            self.currentViewController = newVC;
        }
    }

}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage