YYText icon indicating copy to clipboard operation
YYText copied to clipboard

YYTextLayout 设定了 YYTextContainer 的最大宽度,当出现大量空格时候,无法换行,超出最大宽度的限时。代码如下。

Open GerYun opened this issue 8 years ago • 4 comments

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)

GerYun avatar May 08 '17 07:05 GerYun


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 这样解决是否有违你的设计,改得不对的地方,请见谅

yizhaorong avatar May 10 '17 02:05 yizhaorong

@ibireme 同问

mingyue1991 avatar Mar 15 '19 03:03 mingyue1991

有两种方法可以解决: 1.将label的lineBreakModel设置为NSLineBreakByCharWrapping 2.将文本中的空格替换掉[content stringByReplacingOccurrencesOfString:@" " withString:@"\u00A0"];

两种方法效果一致

但是我现在遇到的问题是我需要把label设置为NSLineBreakByWordWrapping,所以不知道怎么办了

huangyin1109 avatar Apr 28 '19 06:04 huangyin1109

   //处理 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空格不等宽,最终看起来会短一点

vhuichen avatar Jul 08 '21 09:07 vhuichen