69 votes

topLayoutGuide de l'enfant-vue-contrôleur

J'ai un UIPageViewController translucide barre d'état et la barre de navigation. Ses topLayoutGuide 64 pixels, comme prévu.

Cependant, à la vue enfant contrôleurs de l' UIPageViewController rapport topLayoutGuide de 0 pixels, même si elles sont présentées en vertu de la barre d'état et la barre de navigation.

Est-ce le comportement attendu? Si oui, quelle est la meilleure façon de positionner un point de vue d'un enfant de-vue-contrôleur en vertu de la réelle topLayoutGuide?

(court de l'utilisation de parentViewController.topLayoutGuide, je voudrais examiner un hack)

48voto

NachoSoto Points 422

Bien que cette réponse pourrait être correct, je me suis toujours trouvé avoir à voyager de par le confinement de l'arbre jusqu'à trouver la bonne mère-vue-contrôleur et obtenir ce que vous décrivez comme "réel topLayoutGuide". De cette façon, je peux manuellement mettre en oeuvre automaticallyAdjustsScrollViewInsets.

C'est de cette façon que je suis en train de faire:

Dans ma table view controller (une sous-classe de UIViewController en fait), j'ai ceci:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    _tableView.frame = self.view.bounds;

    const UIEdgeInsets insets = (self.automaticallyAdjustsScrollViewInsets) ? UIEdgeInsetsMake(self.ms_navigationBarTopLayoutGuide.length,
                                                                                               0.0,
                                                                                               self.ms_navigationBarBottomLayoutGuide.length,
                                                                                               0.0) : UIEdgeInsetsZero;
    _tableView.contentInset = _tableView.scrollIndicatorInsets = insets;
}

Avis de la catégorie des méthodes en UIViewController, c'est comment j'ai mis en place:

@implementation UIViewController (MSLayoutSupport)

- (id<UILayoutSupport>)ms_navigationBarTopLayoutGuide {
    if (self.parentViewController &&
        ![self.parentViewController isKindOfClass:UINavigationController.class]) {
        return self.parentViewController.ms_navigationBarTopLayoutGuide;
    } else {
        return self.topLayoutGuide;
    }
}

- (id<UILayoutSupport>)ms_navigationBarBottomLayoutGuide {
    if (self.parentViewController &&
        ![self.parentViewController isKindOfClass:UINavigationController.class]) {
        return self.parentViewController.ms_navigationBarBottomLayoutGuide;
    } else {
        return self.bottomLayoutGuide;
    }
}

@end

Espérons que cela aide :)

11voto

chliul Points 68

vous pouvez ajouter une contrainte dans le storyboard et le modifier dans viewWillLayoutSubviews

quelque chose comme ceci:

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    self.topGuideConstraint.constant = [self.parentViewController.topLayoutGuide length];
}

10voto

vinaut Points 1873

Je peux me tromper, mais à mon avis, le comportement est correct. Le topLayout valeur peut être utilisé par le conteneur de-vue-contrôleur à la disposition de son affichage des sous-vues.

La référence dit:

Pour utiliser un dessus en page sans l'aide de contraintes, procurez-vous le guide de la position par rapport au haut tenu de l'contenant de vue.

Dans le parent, par rapport à l'contenant de vue, la valeur 64.

Chez l'enfant, par rapport à l'contenant de vue (la mère), la valeur sera 0.

Dans le conteneur View Controller, vous pouvez utiliser la propriété de cette façon:

- (void) viewWillLayoutSubviews {

    CGRect viewBounds = self.view.bounds;
    CGFloat topBarOffset = self.topLayoutGuide.length;

    for (UIView *view in [self.view subviews]){
        view.frame = CGRectMake(viewBounds.origin.x, viewBounds.origin.y+topBarOffset, viewBounds.size.width, viewBounds.size.height-topBarOffset);
    }
}

L'Enfant-vue-contrôleur n'a pas besoin de savoir qu'il existe un système de Navigation et une barre d'État : ses parent ont déjà jeté son sous-vues de prendre en compte.

Si je crée une nouvelle page, en fonction du projet, de les intégrer dans une manette de navigation, et d'ajouter ce code à la vue parent contrôleurs qu'il semble fonctionner correctement:

enter image description here

8voto

CornPuff Points 1444

La documentation dit d'utiliser topLayoutGuide dans viewDidLayoutSubviews si vous utilisez une sous-classe UIViewController, ou layoutSubviews si vous utilisez une sous-classe UIView.

Si vous utilisez ces méthodes, vous devriez obtenir une valeur non nulle appropriée.

Documentation lien: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instp/UIViewController/topLayoutGuide

2voto

Jesse Rusak Points 33702

Cette question a été traitée dans iOS 8.

Comment définir topLayoutGuide position pour enfant-vue-contrôleur

Essentiellement, le conteneur view controller doivent contraindre l'enfant à la vue du contrôleur (top|bottom|left|right)LayoutGuide que ce serait un autre point de vue. (Dans iOS 7, il était déjà totalement contraint à la priorité, de sorte que cela ne fonctionnait pas.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X