如何设置UILabel的换行模式为字符换行+尾部截断?
UILabel 字符换行+尾部截断实现方案
你不能直接通过NSLineBreakByCharWrapping | NSLineBreakByTruncatingTail组合实现需求,因为这两个NSLineBreakMode枚举值是互斥的,系统只会生效其中一个。正确的做法是结合段落样式的换行策略与截断模式来实现:
实现步骤
- 创建可变段落样式,同时配置尾部截断模式和字符级换行策略
- 将段落样式应用到富文本,赋值给Label的
attributedText - 设置Label的
numberOfLines为0(自动换行)或固定行数
Objective-C 代码示例
// 初始化段落样式 NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; // 设置尾部截断 paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; // 配置字符换行策略 if (@available(iOS 16.0, *)) { // iOS 16+ 直接强制字符换行 paragraphStyle.lineBreakStrategy = NSLineBreakStrategyCharacterBased; } else { // iOS 11-15 用PushOut策略实现近似字符换行效果 paragraphStyle.lineBreakStrategy = NSLineBreakStrategyPushOut; } // 创建带段落样式的富文本 NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"你的文本内容" attributes:@{NSParagraphStyleAttributeName: paragraphStyle}]; // 配置Label UILabel *targetLabel = [[UILabel alloc] init]; targetLabel.attributedText = attributedText; targetLabel.numberOfLines = 0; // 或设置固定行数,比如2
Swift 代码示例
// 初始化段落样式 let paragraphStyle = NSMutableParagraphStyle() // 设置尾部截断 paragraphStyle.lineBreakMode = .byTruncatingTail // 配置字符换行策略 if #available(iOS 16.0, *) { paragraphStyle.lineBreakStrategy = .characterBased } else { paragraphStyle.lineBreakStrategy = .pushOut } // 创建带段落样式的富文本 let attributedText = NSAttributedString(string: "你的文本内容", attributes: [.paragraphStyle: paragraphStyle]) // 配置Label let targetLabel = UILabel() targetLabel.attributedText = attributedText targetLabel.numberOfLines = 0
关键说明
NSLineBreakByCharWrapping是单纯的换行模式,NSLineBreakByTruncatingTail是截断模式,二者属于同一枚举组,无法通过按位或同时生效。lineBreakStrategy用来控制换行的粒度:iOS 16+的characterBased会严格按单个字符换行,更早版本的pushOut会优先在字符边界换行,避免单词中间断开,达到近似字符换行的效果。- 必须设置
numberOfLines,否则Label只会显示一行,截断和换行效果都无法触发。
内容的提问来源于stack exchange,提问作者Seokmin Jeong
相关产品推荐
相关产品推荐

