项目维护<<导航栏标题换行显示>>
此处略去吐槽一万字……
吐槽完了, 工作还是要继续的
问题
导航栏标题太长, 一行显示不全, 测试建议导航栏标题可以两行显示, 两行显示不全, 可以缩放字体.
分析
由于项目已经开发很久了, 每个页面都自定义navigationItem.titleView
, 这个工作量, 想想就不想干😂
控制器中设置导航栏标题分为两种方式:
self.navigationItem.title
self.title
ps:
self.title
相当于同时设置了self.navigationItem.title
和self.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;
}
总结
励志以最少的代码解决看起来比较复杂问题