Как правильно и безошибочно выполнить разбиение на длинные NSAttributedString? - PullRequest
0 голосов
/ 28 октября 2019

Учитывая NSAttriutedString, и я пытаюсь разбить его на несколько страниц и выполнить рендеринг следующим способом, но результат не идеален. Может ли кто-нибудь мне помочь?

Код нумерации страниц

//CoreText Pagination
+ (NSMutableArray *)coreTextPaging:(NSAttributedString *)str textFrame:(CGRect)textFrame{
    NSMutableArray *pagingResult = [NSMutableArray array];

    CFAttributedStringRef cfAttStr = (__bridge CFAttributedStringRef)str;
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(cfAttStr);

    CGPathRef path = CGPathCreateWithRect(CGRectMake(textFrame.origin.x, textFrame.origin.y, textFrame.size.width, textFrame.size.height), NULL);
    int textPos = 0;
    NSUInteger strLength = [str length];
    while (textPos < strLength)  {
        //设置路径
        CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(textPos, 0), path, NULL);
        //生成frame
        CFRange frameRange = CTFrameGetVisibleStringRange(frame);
        NSRange ra = NSMakeRange(frameRange.location, frameRange.length);

        //获取范围并转换为NSRange,然后以NSAttributedString形式保存
        [pagingResult addObject:[str attributedSubstringFromRange:ra]];

        //移动当前文本位置
        textPos += frameRange.length;

        CFRelease(frame);
    }
    CGPathRelease(path);
    CFRelease(framesetter);
    return pagingResult;
}

Затем я помещаю одну из страниц в UITextView, используя следующий метод:

inset_content = UIEdgeInsetsMake(self.h_nav, 10, self.safeAreaInsetsBottom, 10);
textContainer = [[NSTextContainer alloc] initWithSize:self->size_content.size];
view_content = [[ARTextView alloc]initWithFrame:size_content textContainer:textContainer];
[view_content setTextContainerInset:inset_content];
[view_content.textStorage setAttributedString:[array_pages objectAtIndex:page_need_jump_to]];

Но результат не идеален, как в следующем: некоторые слова (недостаточно для одной строки) занимают всю строку, это очевиднонеправильно. кто-нибудь может помочь? Кстати, я использую семейство шрифтов SourceHanSerifCN-Regular и SourceHanSerifCN-Medium. неверный результат

Неправильный результат

...