iPhone开发中电子书App里超长字符串分页问题是本文哟啊介绍的内容,主要是来学习字符串分页的问题,来看本文详细内容讲解。超长字符串分页是所有做电子书之类的程序都会遇到的一个问题. 前一阵搞一个项目, 花了3天时间搞这个小方法, 总是分页不够精确. ***我发现了问题所在: 要用UILabel来显示文字, 而不是TextView!!
大体思路就是,把字符串分段落, 用段落去填充页. 下面是这个小方法, 希望会对大家有帮助:
- -(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];
- }
小结:详解iPhone开发中电子书App里超长字符串分页问题的内容介绍完了,希望通过本文的学习能对你有所帮助!