项目维护<<导航栏标题换行显示>>

  此处略去吐槽一万字……

图片来源于网络

吐槽完了, 工作还是要继续的

问题

导航栏标题太长, 一行显示不全, 测试建议导航栏标题可以两行显示, 两行显示不全, 可以缩放字体.

分析

由于项目已经开发很久了, 每个页面都自定义navigationItem.titleView, 这个工作量, 想想就不想干😂 控制器中设置导航栏标题分为两种方式:

  • self.navigationItem.title
  • self.title

ps: self.title 相当于同时设置了self.navigationItem.titleself.tabBarItem.title

解决

经过上面的分析, 想到可以使用UINavigationItem类目, 重写系统的setTitle:方法, 在setTitle:方法中定义titleView

#import "UINavigationItem+Title.h"

@implementation UINavigationItem (Title)

/**
 覆盖系统的设置导航栏标题方法,自定义title为两行显示

 @param title 标题
 */
- (void)setTitle:(NSString *)title {
    UILabel *titleView = (UILabel *)self.titleView;
    if (!titleView) {
        titleView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - 120, 0)];
        titleView.backgroundColor = [UIColor clearColor];
        titleView.font = [UIFont boldSystemFontOfSize:18];
        titleView.numberOfLines = 2;
        titleView.textColor = [UIColor whiteColor];
        titleView.text = title;
        titleView.adjustsFontSizeToFitWidth = YES;
        titleView.textAlignment = NSTextAlignmentCenter;
        [titleView sizeToFit];
        self.titleView = titleView;
    } else {
        titleView.text = title;
    }
}

@end

由于self.title方法设置导航栏的标题, 不走该方法, 因此需要在BaseViewController重写setTitle:, 然后调用self.navigationItem.title

- (void)setTitle:(NSString *)title {
    [super setTitle:title];
    self.navigationItem.title = title;
}

总结

励志以最少的代码解决看起来比较复杂问题

Loading Disqus comments...
Table of Contents