xcode UILabel分页计算(转来收藏)

  1. -(NSArray*)getPagesOfString:(NSString*)cache withFont:(UIFont*)font inRect:(CGRect)r{  
  2.       
  3.     //返回一个数组, 包含每一页的字符串开始点和长度(NSRange)  
  4.       
  5.     NSMutableArray *ranges=[NSMutableArray array];  
  6.       
  7.     //显示字体的行高  
  8.       
  9.     CGFloat lineHeight=[@"Sample样本" sizeWithFont:font].height;  
  10.       
  11.     NSInteger maxLine=floor(r.size.height/lineHeight);  
  12.       
  13.     NSInteger totalLines=;  
  14.       
  15.     NSLog(@"Max Line Per Page: %d (%.2f/%.2f)",maxLine,r.size.height,lineHeight);  
  16.       
  17.     NSString *lastParaLeft=nil;  
  18.       
  19.     NSRange range=NSMakeRange();  
  20.       
  21.     //把字符串按段落分开, 提高解析效率  
  22.       
  23.     NSArray *paragraphs=[cache componentsSeparatedByString:@"/n"];  
  24.       
  25.     for (int p=;p< [paragraphs count];p++) {  
  26.           
  27.         NSString *para;  
  28.           
  29.         if (lastParaLeft!=nil) {  
  30.               
  31.             //上一页完成后剩下的内容继续计算  
  32.               
  33.             para=lastParaLeft;  
  34.               
  35.             lastParaLeft=nil;  
  36.               
  37.         }else {  
  38.               
  39.             para=[paragraphs objectAtIndex:p];  
  40.               
  41.             if (p<[paragraphs count]-1)  
  42.                   
  43.                 para=[para stringByAppendingString:@"/n"]; //刚才分段去掉了一个换行,现在还给它  
  44.               
  45.         }  
  46.           
  47.         CGSize paraSize=[para sizeWithFont:font  
  48.                            
  49.                          constrainedToSize:r.size  
  50.                            
  51.                              lineBreakMode:lineBreakMode];  
  52.           
  53.         NSInteger paraLines=floor(paraSize.height/lineHeight);  
  54.           
  55.         if (totalLines+paraLines<maxLine) {  
  56.               
  57.             totalLines+=paraLines;  
  58.               
  59.             range.length+=[para length];  
  60.               
  61.             if (p==[paragraphs count]-1) {  
  62.                   
  63.                 //到了文章的结尾 这一页也算  
  64.                   
  65.                 [ranges addObject:[NSValue valueWithRange:range]];  
  66.                   
  67.                 //IMILog(@”===========Page Over=============”);  
  68.                   
  69.             }  
  70.               
  71.         }else if (totalLines+paraLines==maxLine) {  
  72.               
  73.             //很幸运, 刚好一段结束,本页也结束, 有这个判断会提高一定的效率  
  74.               
  75.             range.length+=[para length];  
  76.               
  77.             [ranges addObject:[NSValue valueWithRange:range]];  
  78.               
  79.             range.location+=range.length;  
  80.               
  81.             range.length=;  
  82.               
  83.             totalLines=;  
  84.               
  85.             //IMILog(@”===========Page Over=============”);  
  86.               
  87.         }else{  
  88.               
  89.             //重头戏, 页结束时候本段文字还有剩余  
  90.               
  91.             NSInteger lineLeft=maxLine-totalLines;  
  92.               
  93.             CGSize tmpSize;  
  94.               
  95.             NSInteger i;  
  96.               
  97.             for (i=1; i<[para length]; i++) {  
  98.                   
  99.                 //逐字判断是否达到了本页最大容量  
  100.                   
  101.                 NSString *tmp=[para substringToIndex:i];  
  102.                   
  103.                 tmpSize=[tmp sizeWithFont:font  
  104.                            
  105.                         constrainedToSize:r.size  
  106.                            
  107.                             lineBreakMode:lineBreakMode];  
  108.                   
  109.                 int nowLine=floor(tmpSize.height/lineHeight);  
  110.                   
  111.                 if (lineLeft<nowLine) {  
  112.                       
  113.                     //超出容量,跳出, 字符要回退一个, 应为当前字符已经超出范围了  
  114.                       
  115.                     lastParaLeft=[para substringFromIndex:i-1];  
  116.                       
  117.                     break;  
  118.                       
  119.                 }  
  120.                   
  121.             }  
  122.               
  123.             range.length+=i-1;  
  124.               
  125.             [ranges addObject:[NSValue valueWithRange:range]];  
  126.               
  127.             range.location+=range.length;  
  128.               
  129.             range.length=;  
  130.               
  131.             totalLines=;  
  132.               
  133.             p--;  
  134.               
  135.             //IMILog(@”===========Page Over=============”);  
  136.         }  
  137.           
  138.     }  
  139.     return [NSArray arrayWithArray:ranges];  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值