导航栏项目标题视图位置

16

我正在使用UINavigationItem的titleView属性来设置一个带有所需字体大小/颜色的自定义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;

在导航栏中,我还有一个左侧的按钮。结果是:文本没有居中对齐。我尝试设置标签的x坐标原点,但这没有效果。

7个回答

19

不要使用initWithFrame,改用init,并在你的最后一行代码之后加上[self.headerLabel sizeToFit]


我没有对它进行投票,但我可以理解有人可能会认为它并没有回答所提出的问题,但提供了一个有用的旁路技巧。 - Olie

15
如果将headerLabel作为titleView的子视图,您可以设置headerLabel的frame来控制它在titleView中的位置。
以您当前的方式,您没有这种控制能力。我认为操作系统根据可用空间为您选择titleView的frame。
希望这可以帮助!

嘿,我尝试了这个,但是当我在左侧或右侧放置一个按钮时,我的titleView会被稍微向下推。你能够防止这种情况发生吗? - quantumpotato
这对我也不起作用,我在这里做错了什么?当我执行[self.navigationItem.titleView addSubview:headerLabel];时,headerLabel根本没有出现。我需要先将titleView设置为某些内容吗? - Ben Clayton
如果程序无法正常运行,请将其作为一个新问题写出来,解释你正在做什么,并提供链接到此问题。 - William Jockusch
1
答案是错误的。根据文档,“如果leftBarButtonItem不为nil,则忽略此属性。” - memmons
你帮了我很多!想点赞十次!!这个标签真的到处都是) - trickster77777

3
我在应用商店中的每个应用程序中都使用自定义标题标签来制作我的导航栏。我尝试了许多不同的方法,到目前为止,最简单的方法是完全忽略"titleView",并将标签直接插入"navigationController.view"中。
使用这种方法,即使您使用具有非标准大小的自定义navBar,也很容易使标题标签的框架始终与navigationBar的框架相匹配。
- (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;
}

这种方法的一个注意事项是,如果您没有小心设置标题过长,您的标题可能会覆盖导航栏中的任何按钮。但是,在我看来,与以下问题相比,这个问题要容易解决得多:1)当您有一个rightBarButton时,标题无法居中;2)如果您有一个leftBarButton,则标题不会出现。


1
感谢您的评论。顺便提一下,当我实施了您的方法后,按下返回按钮时创建的视图并没有消失。 - Shaheen Ghiassy

3

我有同样的问题;我只是通过计算标题长度并相应地设置标签框架宽度来解决了这个问题。虽然这不是完美的方法,但可以管理。这是代码。

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]];


}

1

只需计算所需的确切帧大小并向左对齐:

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
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];

0
我自己的解决方法是在viewDidAppear方法中更新titleView的frame。
- (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)];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接