您如何确定自定义 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】:您可以在设置leftBarButtonItem
和rightBarButtonItem
后获得它们的宽度,然后使用它来确定如何在您提供给titleView
的视图中居中。这可能会做你想做的事?
【讨论】:
以上是关于您如何确定自定义 UINavigationItem.titleView 的大小/框架?的主要内容,如果未能解决你的问题,请参考以下文章
如何基于 nib 文件创建 UINavigationItem.TitleView?
自定义 UINavigationItem 类 - 标题取决于 Active UIStoryboard