在多个矩形中绘制一个 NSString

Posted

技术标签:

【中文标题】在多个矩形中绘制一个 NSString【英文标题】:Drawing one NSString in multiple rects 【发布时间】:2012-05-10 15:36:03 【问题描述】:

我有一个很长的字符串,有数千行带有默认字体。因此,与其在一个表格视图单元格中绘制整个内容,我将创建几个单元格来绘制相同的字符串,每个单元格都绘制字符串的下一部分。

我很难找到起点。假设我在矩形中绘制字符串的前 500 像素高度 - 我怎么知道在我的第二个矩形中从哪里开始?如果它是同一个字符串,我如何指定它只绘制字符串的某些部分?

每个单元格都会知道它自己的行号,所以我将能够确定我在表格中的确切位置,我只是不知道字符串如何知道它应该绘制哪个部分..

或者另一个问题是:如何根据一定的行数将一个字符串分解为多个字符串?

编辑:以下是一些我发现可能有用的 NSString 方法,但我仍然不知道如何在我的情况下使用它们:

- (void)getLineStart:(NSUInteger *)startIndex end:(NSUInteger *)lineEndIndex contentsEnd:(NSUInteger *)contentsEndIndex forRange:(NSRange)aRange
- (NSRange)lineRangeForRange:(NSRange)aRange

【问题讨论】:

【参考方案1】:

使用substringWithRange: 这将允许您选择字符串的起点和终点。我会用一些字符来抓取每个部分。因此,第 1 部分将是 0-500,第 2 部分将是 500-1000。这里的问题是你可能会在句子中间中断。您可以使用 lineRangeForRange 之类的方法来确定子字符串的范围。

lineRangeForRange
Returns the range of characters representing the line or lines containing a given range.

- (NSRange)lineRangeForRange:(NSRange)aRange
Parameters
aRange
A range within the receiver.
Return Value
The range of characters representing the line or lines containing aRange, including the line termination characters.

编辑

NSString *string = @"tjykluytjghklukytgjhkkghkj sdkjlhfkjsadgfiulgeje fuaeyfkjasdgfueghf aksjgflkj. wyruehskjluishfoeifh uasyeajhkfa uiyelkjahsdf uayekljshdf aehkfjsd. \n I iheio;fajkdsf sdfhlueshkfjskdhf ujhelkjfh. luehljkfhlsdf. leufhlkjdshfa. \n euoiywhfldsjkhf euyhfsdlkj. ewhlkjfsd. euilhfsdkjishdkjf euhjklsfd. \n";
NSLog(@"string length:%i", [string length]);
NSRange range;
range.length = [string length]/2;
range.location = 0;
NSLog(@"LineRangeForRange:%i", [string lineRangeForRange:range].length);
NSLog(@"Substring:%@", [string substringWithRange:[string lineRangeForRange:range]]);

日志显示:

string length:295
LineRangeForRange:148
Substring:tjykluytjghklukytgjhkkghkj sdkjlhfkjsadgfiulgeje fuaeyfkjasdgfueghf aksjgflkj. wyruehskjluishfoeifh uasyeajhkfa uiyelkjahsdf uayekljshdf aehkfjsd.

因此,我为 LineRangeForRange 提供了一个从零到字符串一半的范围。它可能是该范围内的最后一行“\ n”。然后我抓住了那个子字符串

【讨论】:

嗯,它在句子中间被切断真的会破坏体验..我想让它尽可能自然.. lineRangeForRange 我相信会给你一个不会删减句子的范围。因此,例如,您想要范围为 0-500 个字符,您使用 lineRangeForRange: 范围为 0-500,它将返回一个范围 0-450(这将是行尾)并且您在 0-450 上使用 substringWithRange。跨度> 等等,lineRangeForRange 到底做了什么……我对它给我的结果感到困惑。如果我给它 0, 250,它将返回该字符范围内的完整行? 我有 The apple is the pomaceous fruit of the apple tree, species Malus domestica in the rose family (Rosaceae). It is one of the most widely cultivated tree fruits, and the most widely known of the many members of genus Malus that are used by humans. Apples grow on small, deciduous trees. 我在 lineRangeForRange 中给它的范围是 (0,1),但是子字符串返回我整个段落。我不明白它在做什么? 我猜如果范围内没有结束行字符,它会为您提供字符串中的下一个结束行。所以 (0,1) 会给你第一段。【参考方案2】:

听起来不像是我想在应用程序中阅读文本的方式。为什么不使用 textView?

编辑:我的建议不是将 textView 放在 tableViewCell 中,而是显示被截断的文本的开头,然后单击推送显示 textView 的 viewControllers。有点像 Mail。

【讨论】:

因为我不想将文本视图放在表格单元格中..这仅适用于文本的一部分,我还有其他部分不需要拆分,我需要所有部分具有类似的滚动行为。文本视图有自己的滚动行为,因此与表格视图混合使用会带来不好的体验。.. 很确定您可以在文本视图中关闭滚动。 这将导致高度为 50,000 像素的文本视图 那和 500 个单元格有什么区别?您有一个包含文本视图的适当高度的单元格。文本视图不会滚动,但表格会滚动。 您的表格视图单元格不应高于 2009 像素。它在文档中

以上是关于在多个矩形中绘制一个 NSString的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制多个矩形 FLTK C++

Javascript画布 - 矩形中的相交圆孔或如何合并多个圆弧路径

是否可以用鼠标绘制一个矩形来选择多个DIV?

当我绘制另一个矩形时,如何保留我在 Jpanel 上绘制的矩形?

在画布中使用 globalCompositeOperation 屏蔽多个形状

asp.net GDI+绘制多个矩形