• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 NSAttributedString 的 drawWithRect 中查找最后一个可见的行索引

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:30:25 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在从用户提供的文本创建一个 pdf,但是当文本对于页面来说太大时我遇到了一个问题,我必须计算文本将被切断的位置,以便我可以将下一个 block 移动到下一页.我使用这段代码来绘制属性文本:

    CGRect rect = CGRectFromString(elementInfo[@"rect"]);
    NSString *text = elementInfo[@"text"];
    NSDictionary *attributes = elementInfo[@"attributes"];
    NSAttributedString *attString = [[NSAttributedString alloc] initWithString:text attributes:attributes];
    [attString drawWithRect:rect options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine context:nil];

如何获得“最后一条可见线”所在的位置?



Best Answer-推荐答案


此解决方案的作用是检查您的文本是否适合具有给定框架和字体的 UITextView,如果不适合,它会从字符串中删除最后一个单词并再次检查是否适合.它继续这个过程,直到它适合给定的框架。一旦它达到给定的大小,就会返回字符串应该被分割的索引。

- (NSUInteger)pageSplitIndexForStringNSString *)string 
                              inFrameCGRect)frame 
                             withFontUIFont *)font
{
    CGFloat fixedWidth = frame.size.width;
    UITextView *textView = [[UITextView alloc] initWithFrame:frame];
    textView.text = string;
    textView.font = font;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);

    while (newFrame.size.height > frame.size.height) {
        textView.text = [self removeLastWord:textView.text];

        newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
        newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    }

    NSLog(@"age one text: %@", textView.text);

    NSLog(@"age two text: %@", [string substringFromIndex:textView.text.length]);

    return textView.text.length;
}

删除最后一个单词的方法:

- (NSString *)removeLastWordNSString *)str
{
    __block NSRange lastWordRange = NSMakeRange([str length], 0);
    NSStringEnumerationOptions opts = NSStringEnumerationByWords | NSStringEnumerationReverse | NSStringEnumerationSubstringNotRequired;
    [str enumerateSubstringsInRange:NSMakeRange(0, [str length]) optionspts usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        lastWordRange = substringRange;
        *stop = YES;
    }];
    return [str substringToIndex:lastWordRange.location];
}

要使用此“pageSplit”方法,您需要调用它并检查返回的索引是否与提供的字符串的长度相符。如果返回的索引小于字符串的长度,就知道需要拆分为第二页。

为了在应得的情况下给予一定的信任,我从其他几个 SO 答案(How do I size a UITextView to its content?Getting the last word of an NSString)中借用了代码来提出我的解决方案。


根据您的评论,我已经编辑了我的答案以提供一种方法,您可以在其中发送详细信息并取回要拆分的字符串中的索引。您提供字符串、容器大小和字体,它会让您知道页面拆分发生的位置(字符串中的索引)。

关于ios - 在 NSAttributedString 的 drawWithRect 中查找最后一个可见的行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28764651/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap