25

Dans mon application, j'aimerais que la barre de navigation affiche un titre et un sous-titre.Titre de l'iPhone et sous-titres dans la barre de navigation

Dans cette mesure, j'ai ajouté le code suivant à mon contrôleur de vue:

// Replace titleView 
CGRect headerTitleSubtitleFrame = CGRectMake(0, 0, 200, 44);  
UIView* _headerTitleSubtitleView = [[[UILabel alloc] initWithFrame:headerTitleSubtitleFrame] autorelease]; 
_headerTitleSubtitleView.backgroundColor = [UIColor clearColor]; 
_headerTitleSubtitleView.autoresizesSubviews = YES; 

CGRect titleFrame = CGRectMake(0, 2, 200, 24); 
UILabel *titleView = [[[UILabel alloc] initWithFrame:titleFrame] autorelease]; 
titleView.backgroundColor = [UIColor clearColor]; 
titleView.font = [UIFont boldSystemFontOfSize:20]; 
titleView.textAlignment = UITextAlignmentCenter; 
titleView.textColor = [UIColor whiteColor]; 
titleView.shadowColor = [UIColor darkGrayColor]; 
titleView.shadowOffset = CGSizeMake(0, -1); 
titleView.text = @""; 
titleView.adjustsFontSizeToFitWidth = YES; 
[_headerTitleSubtitleView addSubview:titleView]; 

CGRect subtitleFrame = CGRectMake(0, 24, 200, 44-24); 
UILabel *subtitleView = [[[UILabel alloc] initWithFrame:subtitleFrame] autorelease]; 
subtitleView.backgroundColor = [UIColor clearColor]; 
subtitleView.font = [UIFont boldSystemFontOfSize:13]; 
subtitleView.textAlignment = UITextAlignmentCenter; 
subtitleView.textColor = [UIColor whiteColor]; 
subtitleView.shadowColor = [UIColor darkGrayColor]; 
subtitleView.shadowOffset = CGSizeMake(0, -1); 
subtitleView.text = @""; 
subtitleView.adjustsFontSizeToFitWidth = YES; 
[_headerTitleSubtitleView addSubview:subtitleView]; 

_headerTitleSubtitleView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
             UIViewAutoresizingFlexibleRightMargin | 
             UIViewAutoresizingFlexibleTopMargin | 
             UIViewAutoresizingFlexibleBottomMargin); 

self.navigationItem.titleView = _headerTitleSubtitleView; 

Et aussi mis en œuvre une méthode:

-(void) setHeaderTitle:(NSString*)headerTitle andSubtitle:(NSString*)headerSubtitle { 
    assert(self.navigationItem.titleView != nil); 
    UIView* headerTitleSubtitleView = self.navigationItem.titleView; 
    UILabel* titleView = [headerTitleSubtitleView.subviews objectAtIndex:0]; 
    UILabel* subtitleView = [headerTitleSubtitleView.subviews objectAtIndex:1]; 
    assert((titleView != nil) && (subtitleView != nil) && ([titleView isKindOfClass:[UILabel class]]) && ([subtitleView isKindOfClass:[UILabel class]])); 
    titleView.text = headerTitle; 
    subtitleView.text = headerSubtitle; 
} 

Les choses fonctionnent très bien, merci. Sauf que lors de la rotation de l'iPhone en mode paysage, le titre et le sous-titre ne sont pas réduits automatiquement de la même manière que le titre par défaut de l'élément de navigation.

Des pointeurs?

Merci!

+1

Votre code fonctionne bien et est bien écrit, Merci d'avoir posté. Quand appelez-vous exactement setHeaderTitle? J'ai essayé de le faire quand le viewcontroller poussé appelle viewWillAppear mais ensuite il bascule trop tôt et viewDidAppear bascule trop tard. –

+0

Je l'appelle dans les méthodes init. – Reuven

Répondre

7

Faites les étiquettes titleView et subtitleView dans les propriétés du contrôleur de vue, de sorte que vous puissiez y accéder à partir de n'importe quelle méthode. Ensuite, la rotation du contrôleur de vue, redimensionner les étiquettes:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self adjustLabelsForOrientation:toInterfaceOrientation]; 
} 

- (void) adjustLabelsForOrientation:(UIInterfaceOrientation)orientation { 
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
     titleView.font = [UIFont boldSystemFontOfSize:16]; 
     subtitleView.font = [UIFont boldSystemFontOfSize:11]; 
    } 
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     titleView.font = [UIFont boldSystemFontOfSize:20]; 
     subtitleView.font = [UIFont boldSystemFontOfSize:13]; 
    } 
} 
+0

Merci - cela fonctionne. (J'ai encore besoin de jouer avec les tailles de police de paysage, mais la direction fonctionne) – Reuven

1

Au lieu de ce authoresizing masque

_headerTitleSubtitleView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | 
             UIViewAutoresizingFlexibleRightMargin | 
             UIViewAutoresizingFlexibleTopMargin | 
             UIViewAutoresizingFlexibleBottomMargin); 

vous devez utiliser

_headerTitleSubtitleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
             UIViewAutoresizingFlexibleHeight; 

titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
              UIViewAutoresizingFlexibleHeight; 
subtitleView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
              UIViewAutoresizingFlexibleHeight; 
Questions connexes