UILabel 默认情况下,单行文本、使用固定宽高、固定字体的时候,超出的文本会被省略号代替,但对于某些设计中,省略号是不需要的(设计合理性不在本文讨论范围内)。考虑的采取几种方式:
默认情况
方式一:设置 lineBreakMode
self.label1.lineBreakMode = NSLineBreakByWordWrapping;
方式二:提前计算UILabel 可容纳的字数
实现可行,但总觉得每次渲染都得重新计算,这有多麻烦
方式三:取巧,使用UITextView 代替UILabel:
UITextView 是文本域的显示组件,默认情况不存在最后一个字的溢出问题(折到第2行了),但UITextView 本身比UIlabel 可响应用户的操作更多,所以需要做一些设置才能保障正常的事件响应(尤其在Cell 里面的时候)
示例(仅贴出主要差异部分)
CGFloat labelHeight = 22;
CGFloat fontSize = 15;
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.maximumLineHeight = labelHeight;
paragraphStyle.minimumLineHeight = labelHeight;
paragraphStyle.lineSpacing = labelHeight/2.0f;
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
NSAttributedString *aString = [[NSAttributedString alloc] initWithString:@"测试文字1标题测试" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:[UIColor whiteColor],NSBaselineOffsetAttributeName:[NSNumber numberWithFloat:labelHeight/2.0f],NSParagraphStyleAttributeName:paragraphStyle}];
self.demoTextView.userInteractionEnabled = NO;
[self.demoTextView resignFirstResponder];
self.demoTextView.contentInset = UIEdgeInsetsMake(0, -4, 0, 0);
self.demoTextView.attributedText = aString;
最终效果:
注意点:
1.使用NSAttributedString对文本设置相应的样式和行高、行距;
2.禁止userInteractionEnabled,防止UITextView的事件响应(编辑、选择);
3.resignFirstResponder,设为非第一响应者,在cell中尤其重要,否则点击文字无法触发cell 的 didSelected 的事件;
4.相比UILabel,内存占用多一些,尤其在大量cell中使用时。
懒也是一种生产力