`

解决超长字符串分页问题

 
阅读更多

这是所有做电子书之类的程序都会遇到的一个问题. 前一阵搞一个项目, 花了3天时间搞这个小方法, 总是分页不够精确. 最后我发现了问题所在: 要用UILabel来显示文字, 而不是TextView!! 我发现盛大起点中文的电子书app还存在分页不准的问题, 李博 要努力噢 哈哈~~ 大体思路就是,把字符串分段落, 用段落去填充页. 下面是这个小方法, 希望会对大家有帮助:

-(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{

//返回一个数组, 包含每一页的字符串开始点和长度(NSRange)

NSMutableArray *ranges=[NSMutableArray array];

//断行类型

UILineBreakMode lineBreakMode=UILineBreakModeCharacterWrap;

//显示字体的行高

CGFloat lineHeight=[@"Sample样本" sizeWithFont:font].height;

NSInteger maxLine=floor(r.size.height/lineHeight);

NSInteger totalLines=0;

NSLog(@”Max Line Per Page: %d (%.2f/%.2f)”,maxLine,r.size.height,lineHeight);

NSString*lastParaLeft=nil;

NSRange range=NSMakeRange(0, 0);

//把字符串按段落分开, 提高解析效率

NSArray *paragraphs=[cache componentsSeparatedByString:@"/n"];

for (int p=0;p< [paragraphs count];p++) {

NSString*para;

if (lastParaLeft!=nil) {

//上一页完成后剩下的内容继续计算

para=lastParaLeft;

lastParaLeft=nil;

}else {

para=[paragraphs objectAtIndex:p];

if (p<[paragraphs count]-1)

para=[para stringByAppendingString:@"/n"]; //刚才分段去掉了一个换行,现在换给它

}

CGSize paraSize=[para sizeWithFont:font

constrainedToSize:r.size

lineBreakMode:lineBreakMode];

NSInteger paraLines=floor(paraSize.height/lineHeight);

if (totalLines+paraLines<maxLine) {

totalLines+=paraLines;

range.length+=[para length];

if (p==[paragraphs count]-1) {

//到了文章的结尾 这一页也算

[ranges addObject:[NSValue valueWithRange:range]];

//IMILog(@”===========Page Over=============”);

}

}else if (totalLines+paraLines==maxLine) {

//很幸运, 刚好一段结束,本页也结束, 有这个判断会提高一定的效率

range.length+=[para length];

[ranges addObject:[NSValue valueWithRange:range]];

range.location+=range.length;

range.length=0;

totalLines=0;

//IMILog(@”===========Page Over=============”);

}else{

//重头戏, 页结束时候本段文字还有剩余

NSInteger lineLeft=maxLine-totalLines;

CGSize tmpSize;

NSInteger i;

for (i=1; i<[para length]; i++) {

//逐字判断是否达到了本页最大容量

NSString *tmp=[para substringToIndex:i];

tmpSize=[tmp sizeWithFont:font

constrainedToSize:r.size

lineBreakMode:lineBreakMode];

int nowLine=floor(tmpSize.height/lineHeight);

if (lineLeft<nowLine) {

//超出容量,跳出, 字符要回退一个, 应为当前字符已经超出范围了

lastParaLeft=[para substringFromIndex:i-1];

break;

}

}

range.length+=i-1;

[ranges addObject:[NSValue valueWithRange:range]];

range.location+=range.length;

range.length=0;

totalLines=0;

p–;

//IMILog(@”===========Page Over=============”);

}

}

return [NSArray arrayWithArray:ranges];

}


分享到:
评论

相关推荐

    GridView控件使用省略号替换超长字符

    超长字符的显示问题通常与列宽有关,因此需要对需要限制长度的列进行宽度设定。可以在GridView的`Columns`集合中找到对应的`BoundField`或`TemplateField`,并设置`ItemStyle-Width`属性。例如: ```xml ``` 3...

    PHP实现的超长文本分页显示功能示例

    总而言之,通过本篇示例,我们了解到PHP通过字符串操作来实现超长文本的分页显示功能的具体实现方法,涵盖了文件读取、字符串操作以及分页逻辑等多个知识点,为需要实现相关功能的开发者提供了一个实用的参考。

    解决微服务Fegin调用压缩问题-若依

    "JSON parse error: Illegal character ((CTRL-CHAR, code 31))"这个错误通常是由于JSON字符串中含有非法字符,这里的"CTRL-CHAR, code 31"指的是ASCII码值为31的控制字符,这个字符在JSON标准中是不允许的。...

    GridView 72绝技

    10. **超长字符串替换** - 使用`DataFormatString`结合`String.Format`函数,用"..."替换超过一定长度的字符串。 11. **一般换行与强制换行** - 使用` `标签或CSS的`white-space`属性来控制文本换行行为。 12...

    Gridview控件的使用详解

    用“…”代替超长字符串** - **字符串截断**:当某个字段的文本过长时,可以使用省略号 “…” 来代替过长的部分,从而保持表格的整洁性。 **11. 一般换行与强制换行** - **换行**:在某些情况下,可能需要让 ...

    <.net实例>--gridview使用大全

    GridView 实现用“…”代替超长字符串 **示例:** - 使用 `DataFormatString` 和 `Text` 属性。 - 示例代码略。 **解释:** - 当字符串长度超过一定限制时,使用省略号代替剩余部分。 ##### 12. GridView 一般...

    文章管理系统

    11.解决后台编辑器之前空2格低于一个汉字的问题 12.完善几个细节问题 13.整合20121103~20121220补丁 2012年12月20日 ★更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。 1.富媒体...

    C#精髓-- GridView 72般绝技

    GridView实现用“...”代替超长字符串 **知识点**:处理超过指定长度的文本,使用省略号来表示。 - **使用DataFormatString**:通过设置 `DataFormatString` 来截断文本并添加省略号。 - 示例代码:设置文本列的...

Global site tag (gtag.js) - Google Analytics