7
votes

UinavigationController: titre saute dans l'animation de redimensionnement

J'ai une application iPad où je voudrais masquer et montrer une liste de catégories (type de petite vue dans un contrôleur de visualisation scindée) et la vue principale contenant une pile UinavigationController.

Je voudrais redimensionner la vue UinavigationController pour remplir l'écran entier lorsque la liste des catégories est masquée et rétrécir lorsque je affiche la liste.

Je l'ai travaillé, sauf que le titre de la barre de navigation passe immédiatement à son nouveau décalage lors de la définition du cadre dans une animation Begin / Balit Block.

Des idées Comment arrêter le saut du titre?


0 commentaires

4 Réponses :


2
votes

J'ai récemment rencontré un problème similaire; J'ai eu une sous-vision de la vue animatrice qui sautait immédiatement à sa nouvelle position. Cela se passait car -Layoutsubviews a été appelé à ce point de vue à la suite de moi de la modifier par programme avant l'animation terminée. Faites-vous quelque chose comme changer le texte du titre ou de la modifier d'une manière ou d'une autre, causerait -Layoutsubviews pour être appelé dessus?


1 commentaires

J'ai eu une situation dans laquelle un morceau de code appelé layoutifned dans ViewWillappear . Suppression du Layoutifned a supprimé l'animation étrange.



3
votes

J'ai utilisé ceci pour la correction de ces sauts dans la barre d'uoinavigation pour le bouton et le bouton droit. XXX

J'espère que cela vous aidera; -)


3 commentaires

Bonjour, merci pour votre réponse +1. Vous m'avez certainement signalé dans la bonne direction, mais je ne peux pas accepter votre réponse comme c'est parce que c'est hideux! Aucune vérification de la classe ... ne fonctionnera que si vous n'avez qu'un bouton Titre et RHS (c'est-à-dire faire face à un bouton arrière). Si Apple change l'ordre d'affichage, il va casser..etc. S'il vous plaît soumettre une solution plus robuste pour répondre à être acceptée (ou je vais répondre avec ma propre solution)! Acclamations :)


Haha, bien sûr que c'était hideux! :) c'était juste une solution rapide dans mon projet. Est-ce mieux? Quelle est votre solution basée sur?


Ouais, c'est mieux, accepté! Va poster le mien aussi ... Le vôtre ne va pas faire face à un bouton arrière et d'autres scénaristes possibles, je pense.



1
votes

Ma solution semble faire face à tous les scénarios que j'ai frappés dans mon application. Évidemment encore un peu de hack, donc aucune garantie ne fonctionnera toujours!

@implementation UINavigationBar (Nick)

- (void)layoutSubviews {
    [super layoutSubviews];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        UIView* titleView = nil;
        CGFloat buttonWidths = 0;
        for (UIView* subview in [self subviews]) {

            if ([subview class] == NSClassFromString(@"UINavigationItemView")) {
                if (titleView) {
                    // Exit here - if there is more than one title, probably doing a pop
                    return;
                }
                titleView = subview;
            }
            else if ([subview class] == [UIView class] ||                           // bar button with custom view
                     [subview class] == NSClassFromString(@"UINavigationButton")) { // or ordinary bar button

                buttonWidths += subview.frame.size.width;
                // is it RHS?
                if (subview.frame.origin.x > subview.frame.size.width) {
                    [subview setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
                }
                else {
                    [subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
                }
            }
            else if ([subview class] == NSClassFromString(@"UINavigationItemButtonView")) {
                // pretty sure this is always the back button
                buttonWidths += subview.frame.size.width;
                [subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
            }
        }


        if (titleView) {
            buttonWidths += 20; // seems to be apple indentation
            CGRect rect = titleView.frame;
            if (rect.size.width > self.frame.size.width - buttonWidths) {
                rect.size.width = self.frame.size.width - buttonWidths;
                titleView.frame = rect;
            }

            titleView.center = self.center;
        }
    }
}


0 commentaires

1
votes

Cela a fonctionné bien pour moi lorsque j'ai inclus [autoavigationController.navigationbar LayouSubviews] code> dans le bloc d'animation lui-même. Voici l'exemple de code:

[UIView animateWithDuration:0.5
                 animations:^{
                     [self.navigationController.navigationBar setFrame:newFrame];
                     [self.navigationController.navigationBar layoutSubviews];
                 }];


1 commentaires

Il n'est pas autorisé à appeler Layoutsubviews directement