6

这是关于使用核心图形的 PDF 格式。但是当涉及在两页上打印字符串时,它可能与任何类型的分页有关。

我需要将一个字符串分布在几页上。对于较小的字符串,这不是真正的问题。对于那些我使用 NSString UIKit 扩展sizeWithFont来确定全文是否适合当前页面的人。如果是,那么我打印它,drawInRect如果不是,那么我将它移到下一页。

工作正常,但不适合较长的字符串。在我的应用程序中,单个字符串(由用户提供)甚至可能比整页长。

当给定页面的完整页面或剩余空间时,我如何确定 NSString 的哪一部分可以显示在给定的矩形中,以便我可以将其切断并打印剩余的字符串(或至少一部分)在下一页?

我想到了一个替代方案。那就是将全文绘制到屏幕外的图形上下文中,然后将创建的图像切割成适合页面上可用空间的切片。但如果我这样做,那么我需要将切割线准确地放置在文本行之间。坦率地说,我不确定如何确定包含图形的文本在哪里可以安全地切割成两个(或更多)部分,而不会在中间切割一行文本。

我希望我表达自己是可以理解的,并且有人来救援。

4

3 回答 3

2

在 Core Text 中,有一个非常相关的 function,它的最后一个参数(一个指向 CRange 的指针)定义如下:

fitRange
返回时,包含实际适合约束大小的字符串范围。
于 2013-03-10T20:36:32.697 回答
2

对于不使用 Core Text 的一般情况,您可以继续向字符串添加字符,直到其大小过大。这可能非常快,如果你有非常大的字符串(如你所见),你可以通过简单的二进制搜索来加速它。

如果您使用的是 Core Text,只需CTFrame为您要填充的区域创建一个,然后向它询问它使用的范围CTFrameGetVisibleStringRange()

于 2013-03-10T17:49:57.317 回答
0

使用近似值怎么样?

- (NSInteger)lengthOfString:(NSString *)str
           thatFitsIntoView:(UIView *)displayView
                   withFont:(UIFont *)font
{
    CGSize textSize = [str sizeWithFont:font
                               forWidth:displayView.frame.size.width
                          lineBreakMode:NSLineBreakByWordWrapping];

    NSInteger lengthThatFits;
    if (textSize.height > displayView.frame.size.height) {
        lengthThatFits = str.length * displayView.frame.size.height / textSize.height;
    } else {
        lengthThatFits = str.length;
    }

    return lengthThatFits;
}

像这样称呼它:

NSString *str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eros"
    "nulla, commodo eget fringilla nec, varius nec ligula. Donec pulvinar eros sed diam"
    "euismod scelerisque. Mauris imperdiet leo at elit vulputate ullamcorper. Nullam"
    "condimentum odio a lacus tempus ac pretium justo tincidunt.";

UIFont *font = [UIFont systemFontOfSize:16.0]; // or whatever
UIView *displayView = // the view in which you intend to present the string

NSInteger length = [self lengthOfString:str thatFitsIntoView:displayView usingFont:font];
NSString *displayedString = [str substringToIndex:length];
于 2013-03-10T11:20:16.933 回答