0

我想检查 a 的标题是否UINavigationItem被截断。

我这样设置标题:self.navigationItem.title = whatever.

我知道我可以检查 a 中的文本UILabel是否像这样被截断:

CGSize size = [label.text sizeWithFont:[UIFont fontWithName:@"myfont" size:18.0]];
if (size.width > label.bounds.size.width) {
    // set a shorter title
}

我什至可以找到UINavigationItemView显示标题的对象,如下所示:

UIView *navItemView;
for (UIView *view in self.navigationController.navigationBar.subviews) {
    if ([view isKindOfClass:NSClassFromString(@"UINavigationItemView")]) {
        navItemView = view;
    }
}

但我不能将此方法应用于navItemView因为它的宽度似乎总是正好 58,这比其中的标题要小得多,所以据此看来,标题似乎被截断了,即使它不是.

所以,我的问题归结为:如何找到标题中显示的宽度UINavigationItem

更新:找到了解决我的问题的方法,但它并不完全理想、完美或可靠,所以我还没有将其标记为答案。如果有人有更好的解决方案,请分享。

4

2 回答 2

2

我会尝试的是,将其UINavigationItemView转换为 a ,使用属性获取UILabel它的文本并使用.textCGSize-sizeWithFont:constrainedToSize:

UILabel *navItemView;
    for (UIView *view in self.navigationController.navigationBar.subviews) {
         if ([view isKindOfClass:NSClassFromString(@"UINavigationItemView")]) {
           navItemView = (UILabel*)view;
           CGSize theSize = [navItemView.text sizeWithFont:[UIFont systemFontOfSize:navItemView.font.systemFontSize] constrainedToSize:260 lineBreakMode:UILineBreakModeWordWrap];
        }
}

现在您可以使用 的.width属性theSize来找出文本的宽度。

注意:这是理论上的,未经测试。我希望它有效!期待你如何使用它。=)

于 2012-06-09T04:44:02.107 回答
1

终于找到了解决办法:

self.navigationItem.title = title;

CGFloat titleWidth = 320 - (5.0 + self.navigationItem.backBarButtonItem.width + 10.0 + 10.0 + self.navigationItem.rightBarButtonItem.width + 5.0);
if ([self.navigationItem.title sizeWithFont:[UIFont fontWithName:@"myfont" size:18.0]].width > titleWidth) {
    self.navigationItem.title = aShorterTitle;
}

说明:titleWidth是手动计算导航栏中标题剩余的空间量。换句话说:

导航栏的总宽度 (320) - (后退按钮与屏幕左侧之间的间隙大小 (5) + 后退按钮的宽度 + 后退按钮和标题之间的间隙大小 (10) + 标题和右侧栏之间的间隙大小按钮 (10) + 右栏按钮的宽度 + 右栏按钮与屏幕右侧之间的间隙大小 (5))

注意:间隙大小(5 和 10)是手动测量的,并且精确到像素,但 Apple 可能会在软件版本之间稍微更改它们,因此这可能并不总是准确的。

另请注意:此解决方案适用于带有后退按钮和一个右栏按钮的纵向模式导航栏。如果您的不同,则必须手动调整。

如您所见,这不是一个完美的解决方案,所以如果有人有更好的解决方案,请分享。

于 2012-06-09T07:14:36.540 回答