ibireme / YYText

Powerful text framework for iOS to display and edit rich text.
MIT License
8.84k stars 1.68k forks source link

fixedLineHeight导致_showHighlightAnimated时文本行数变化 #934

Open yixianxueqi opened 3 years ago

yixianxueqi commented 3 years ago

iOS10.3.1上复现的; 为了解决富文本中含有的emoji导致行高不一致,我使用了

let modifier = YYTextLinePositionSimpleModifier()
modifier.fixedLineHeight = ceil(FS2.lineHeight)
let container = YYTextContainer()
container.size = CGSize(width: attributedTextMaxWidth, height: CGFloat.greatestFiniteMagnitude)
container.linePositionModifier = modifier
container.insets = UIEdgeInsets.zero
if let attrText = state.renderedText {
    let layout: YYTextLayout? = YYTextLayout(container: container, text: attrText)
    state.renderedTextLayout = layout
}

但是在触发highlight时,在_showHighlightAnimated中重新触发布局

[YYTextLayout layoutWithContainer:_innerContainer text:hiText];

中发现,此处constraintRectBeforeExtended是文本展示实际的size(经过行高调整后),但是获取的line的bounds是未调整前的(比调整后的偏大),导致高度超出被break了使最后一行被丢弃了, UI上反应的就是文本行数发生了变化;

        YYTextLine *line = [YYTextLine lineWithCTLine:ctLine position:position vertical:isVerticalForm];
        CGRect rect = line.bounds;
        if (constraintSizeIsExtended) {
            if (isVerticalForm) {
                if (rect.origin.x + rect.size.width >
                    constraintRectBeforeExtended.origin.x +
                    constraintRectBeforeExtended.size.width) break;
            } else {
                if (rect.origin.y + rect.size.height >
                    constraintRectBeforeExtended.origin.y +
                    constraintRectBeforeExtended.size.height) break;
            }
        }

1 2