UINavigationItem titleПросмотреть позицию - PullRequest
15 голосов
/ 26 июня 2010

Я использую свойство titleView UINavigationItem, чтобы установить пользовательскую UILabel с желаемым размером / цветом шрифта. Вот мой код:

self.headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 44.0)];
self.headerLabel.textAlignment = UITextAlignmentCenter;
self.headerLabel.backgroundColor = [UIColor clearColor];
self.headerLabel.font = [UIFont boldSystemFontOfSize:20.0];
self.headerLabel.textColor = [UIColor colorWithRed:0.259 green:0.280 blue:0.312 alpha:1.0];
self.navigationItem.titleView = self.headerLabel;

В панели навигации у меня также есть кнопка левой панели. Результат таков:

альтернативный текст http://cl.ly/41164eec656c96e7c913/content

Как видите, текст не отцентрирован. Я попытался установить X происхождения метки, но это не имеет никакого эффекта.

Ответы [ 7 ]

19 голосов
/ 26 октября 2011

Вместо initWithFrame просто используйте init и ставьте [self.headerLabel sizeToFit] после вашей последней строки кода.

15 голосов
/ 26 июня 2010

Если вы сделаете headerLabel подпредставлением titleView, вы можете установить фрейм headerLabel, чтобы контролировать, куда он идет в titleView.

То, как вы делаете это сейчас, у вас нет этого контроля. Я думаю, что ОС выбирает кадр titleView для вас на основе доступного пространства.

Надеюсь, это поможет!

3 голосов
/ 11 сентября 2012

У меня такая же проблема;Я просто каким-то образом решил эту проблему, рассчитав длину заголовка и соответственно установив ширину рамки надписи.Хотя это не идеальный, но может быть управляемым.Вот код.

label = [[UILabel alloc] init];
label.backgroundColor = [UIColor clearColor];
label.font = [ UIFont fontWithName: @"XXII DIRTY-ARMY" size: 32.0 ];
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.0f];
label.textAlignment = UITextAlignmentCenter;
label.textColor =[UIColor orangeColor];
//label.text=categoryTitle;
CGFloat verticalOffset = 2; 
NSString *reqSysVer = @"5.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)           
{
    if (categoryTitle.length > 8)
    {
    label.frame = CGRectMake(0, 0, 300, 44);
    }else {
        label.frame = CGRectMake(0, 0, 80, 44);
    }

    self.navigationItem.titleView = label;  
     self.navigationItem.title=label.text;
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset   forBarMetrics:UIBarMetricsDefault];
     [[UIBarButtonItem appearance] setTintColor:[UIColor newBrownLight]];


}
3 голосов
/ 02 марта 2012

Я использовал собственные заголовки для своих навигационных панелей в каждом приложении, которое есть в магазине приложений.Я протестировал множество различных способов сделать это, и к far самый простой способ использовать пользовательский ярлык на панели навигации - полностью игнорировать titleView и вставить свой ярлык непосредственно в navigationController.view. * 1005.*

При таком подходе легко, чтобы рамка метки заголовка всегда соответствовала рамке панели навигации - даже если вы используете нестандартный navBar с нестандартным размером.

- (void)viewDidLoad {
   [self.navigationController.view addSubview:self.titleLabel];
   [super viewDidLoad];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:
             (UIInterfaceOrientation)interfaceOrientation {
   return YES;
}

- (void)didRotateFromInterfaceOrientation:
             (UIInterfaceOrientation)fromInterfaceOrientation {
   [self frameTitleLabel];
}

- (UILabel *) titleLabel {
   if (!titleLabel) {
      titleLabel = [[UILabel alloc]           
          initWithFrame:self.navigationController.navigationBar.frame];

       titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:18];
       titleLabel.text = NSLocalizedString(@"Custom Title", nil);
       titleLabel.textAlignment = UITextAlignmentCenter;
       titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
   }
   return titleLabel;
}

- (void) frameTitleLabel {
   self.titleLabel.frame = self.navigationController.navigationBar.frame;
}

Единственное предупреждениев этом случае ваш заголовок может перетекать поверх любых кнопок, которые есть в navBar, если вы не будете осторожны и установите заголовок слишком длинным.Но, IMO, это гораздо менее проблематично, чем 1) Заголовок не центрируется правильно, когда у вас есть rightBarButton или 2) Заголовок не появляется, если у вас есть leftBarButton.

1 голос
/ 02 апреля 2011

Просто рассчитайте точный необходимый размер кадра и выровняйте по левому краю:

UIFont* font = [UIFont fontWithName:@"Bitsumishi" size:20];
CGSize maximumLabelSize = CGSizeMake(296,9999);
CGSize expectedLabelSize = [title sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeCharacterWrap]; 
CGRect frame = CGRectMake(0, 0, expectedLabelSize.width, expectedLabelSize.height);
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease];
label.font = font;
label.textAlignment = UITextAlignmentLeft;
label.text = title;
self.titleView = label;
0 голосов
/ 21 ноября 2012

Для меня сработало обновление кадра titleView в методе viewDidAppear.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIView *titleView = self.navigationItem.titleView;
    CGRect navBarFrame = self.navigationController.navigationBar.frame;
    [titleView setFrame:CGRectMake((CGRectGetWidth(navBarFrame) - TitleWidth) / 2, (CGRectGetHeight(navBarFrame) - TitleHeight) / 2, TitleWidth, TitleHeight)];
}
0 голосов
/ 18 октября 2011
UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
lbl.text = @"Home";
lbl.textAlignment = UITextAlignmentCenter;
lbl.backgroundColor = [UIColor clearColor];
lbl.textColor = [UIColor whiteColor];
lbl.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20];
lbl.shadowColor = [UIColor blackColor];
lbl.shadowOffset = CGSizeMake(0,1);
self.navigationItem.titleView = vw;
[self.navigationItem.titleView addSubview:lbl];
...