检查UINavigationItem标题是否被截断

时间:2012-06-09 04:14:15

标签: iphone objective-c ios ipad user-interface

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

我将标题设置为:self.navigationItem.title = whatever

我知道我可以检查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中显示的标题宽度?

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

2 个答案:

答案 0 :(得分:2)

我要尝试的是,将UINavigationItemView转换为UILabel,使用.text属性获取其文本,并获取字符串的CGSize -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的{​​{1}}属性来查找文字的宽度。

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

答案 1 :(得分: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可能会在软件版本之间稍微改变它们,因此这可能并不总是精确。

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

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