菜鸟教程小白 发表于 2022-12-13 05:30:25

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


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

<pre><code>    CGRect rect = CGRectFromString(elementInfo[@&#34;rect&#34;]);
    NSString *text = elementInfo[@&#34;text&#34;];
    NSDictionary *attributes = elementInfo[@&#34;attributes&#34;];
    NSAttributedString *attString = [ initWithString:text attributes:attributes];
    ;
</code></pre>

<p>如何获得“最后一条可见线”所在的位置?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>此解决方案的作用是检查您的文本是否适合具有给定框架和字体的 <code>UITextView</code>,如果不适合,它会从字符串中删除最后一个单词并再次检查是否适合.它继续这个过程,直到它适合给定的框架。一旦它达到给定的大小,就会返回字符串应该被分割的索引。</p>

<pre><code>- (NSUInteger)pageSplitIndexForString:(NSString *)string
                              inFrame:(CGRect)frame
                           withFont:(UIFont *)font
{
    CGFloat fixedWidth = frame.size.width;
    UITextView *textView = [ initWithFrame:frame];
    textView.text = string;
    textView.font = font;
    CGSize newSize = ;
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);

    while (newFrame.size.height &gt; frame.size.height) {
      textView.text = ;

      newSize = ;
      newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    }

    NSLog(@&#34;Page one text: %@&#34;, textView.text);

    NSLog(@&#34;Page two text: %@&#34;, );

    return textView.text.length;
}
</code></pre>

<p>删除最后一个单词的方法:</p>

<pre><code>- (NSString *)removeLastWord:(NSString *)str
{
    __block NSRange lastWordRange = NSMakeRange(, 0);
    NSStringEnumerationOptions opts = NSStringEnumerationByWords | NSStringEnumerationReverse | NSStringEnumerationSubstringNotRequired;
    ) options:opts usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
      lastWordRange = substringRange;
      *stop = YES;
    }];
    return ;
}
</code></pre>

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

<p>为了在应得的情况下给予一定的信任,我从其他几个 SO 答案(<a href="https://stackoverflow.com/a/11053075/2788608" rel="noreferrer noopener nofollow">How do I size a UITextView to its content?</a> 和 <a href="https://stackoverflow.com/a/11053075/2788608" rel="noreferrer noopener nofollow">Getting the last word of an NSString</a>)中借用了代码来提出我的解决方案。</p>

<hr/>

<p>根据您的评论,我已经编辑了我的答案以提供一种方法,您可以在其中发送详细信息并取回要拆分的字符串中的索引。您提供字符串、容器大小和字体,它会让您知道页面拆分发生的位置(字符串中的索引)。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 NSAttributedString 的 drawWithRect 中查找最后一个可见的行索引,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28764651/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28764651/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 NSAttributedString 的 drawWithRect 中查找最后一个可见的行索引