YYText
YYText copied to clipboard
YYTextLayout 设定了 YYTextContainer 的最大宽度,当出现大量空格时候,无法换行,超出最大宽度的限时。代码如下。
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"aaaaaaaaaaaaaaaaaaa a"];
YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(200,MAXFLOAT)];
YYTextLayout *layout = [YYTextLayout layoutWithContainer:container str];
(lldb) po layout.textBoundingSize
(width = 291, height = 30)
YYTextLine *line = [YYTextLine lineWithCTLine:ctLine position:position vertical:isVerticalForm maxWidth:container.size.width];
+ (instancetype)lineWithCTLine:(CTLineRef)CTLine position:(CGPoint)position vertical:(BOOL)isVertical maxWidth:(CGFloat)maxWidth {
if (!CTLine) return nil;
YYTextLine *line = [self new];
line->_maxWidth = maxWidth;
line->_position = position;
line->_vertical = isVertical;
[line setCTLine:CTLine];
return line;
}
_lineWidth = CTLineGetTypographicBounds(_CTLine, &_ascent, &_descent, &_leading);
_lineWidth = MIN(_lineWidth, _maxWidth);
我是这样解决的,可以参考一下
@ibireme 这样解决是否有违你的设计,改得不对的地方,请见谅
@ibireme 同问
有两种方法可以解决: 1.将label的lineBreakModel设置为NSLineBreakByCharWrapping 2.将文本中的空格替换掉[content stringByReplacingOccurrencesOfString:@" " withString:@"\u00A0"];
两种方法效果一致
但是我现在遇到的问题是我需要把label设置为NSLineBreakByWordWrapping,所以不知道怎么办了
//处理 YYText 文本包含连续空格字符时,宽高计算错误的bug
NSMutableString *text = content.text.mutableCopy;
__block NSInteger flag = 0;//0未开始 1开始
__block NSRange range = NSMakeRange(0, 0);
[text enumerateSubstringsInRange:NSMakeRange(0, text.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if ([substring isEqualToString:@" "]) {
if (flag == 1) {
range.length += 1;
} else {
flag = 1;
range = substringRange;
}
} else {
if (flag && range.length > 2) {
range.location += 1;
range.length -= 2;
[text replaceCharactersInRange:range withString:@"\u00A0"];
}
flag = 0;
}
}];
if (flag && range.length > 2) {
range.location += 1;
range.length -= 2;
[text replaceCharactersInRange:range withString:@"\u00A0"];
}
简单处理下,但由于 \u00A0 跟空格不等宽,最终看起来会短一点