您如何确定自定义 UINavigationItem.titleView 的大小/框架?

Posted

技术标签:

【中文标题】您如何确定自定义 UINavigationItem.titleView 的大小/框架?【英文标题】:How do you determine the size/frame of a custom UINavigationItem.titleView? 【发布时间】:2011-11-27 18:24:51 【问题描述】:

在创建自定义视图并将其分配给 navigationItem.titleView 属性后,它会像这样显示

自定义视图填充两个按钮之间的空间。因此,自定义视图不以导航栏为中心。如何在 .titleView 属性中确定视图的框架?我想在导航栏中将一些文本居中,比如在时间戳下方。

【问题讨论】:

【参考方案1】:

如果你真的想得到titleView的框架(在你的顶层视图的坐标空间中),你可以这样做:

[self.navBar layoutIfNeeded];
CGRect titleViewFrameInTopLevelViewSpace = [self.navigationItem.titleView
    convertRect:self.navigationItem.titleView.bounds
    toView:self.view];

如果您刚刚分配了titleView,则需要执行layoutIfNeeded,因为默认情况下,导航栏在下一次通过运行循环之前不会布置其子视图。

也就是说,titleView 会自动居中,如果合适的话。我认为您将自定义视图的框架(或边界)设置得太大。我测试了这两种方式:

我直接在 XIB 中设置了titleView。我只是将对象库中的一个视图拖到导航栏的中心: 它会自动将视图大小调整为 128x33。调整大小手柄让我调整大小。它保持居中,直到与“分类”按钮重叠。然后它向左移动。

我在viewDidLoad 中设置了titleView 属性:

- (void)viewDidLoad

    [super viewDidLoad];
    UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 33)];
    customView.backgroundColor = [UIColor greenColor];
    self.navItem.titleView = customView;
 

结果如下所示:

【讨论】:

谢谢罗伯。这就是导致视图不居中的原因。【参考方案2】:

您可以在设置leftBarButtonItemrightBarButtonItem 后获得它们的宽度,然后使用它来确定如何在您提供给titleView 的视图中居中。这可能会做你想做的事?

【讨论】:

以上是关于您如何确定自定义 UINavigationItem.titleView 的大小/框架?的主要内容,如果未能解决你的问题,请参考以下文章

未显示自定义 UINavigationItem 上的标题

如何基于 nib 文件创建 UINavigationItem.TitleView?

自定义 UINavigationItem 类 - 标题取决于 Active UIStoryboard

设置 uinavigationitem 的后退按钮不起作用

iOS开发:关于UINavigationItem和tintColor的沉思

如何制作像 Bumble 一样的导航栏