Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks
          制作 iPhone 電子書時(shí),如果把大段文字放在 UITextView 或 UILabel 里顯示,是不能分頁的,閱讀時(shí)就像再看一大卷滾不到頭的紙帶,用戶體驗(yàn)很差。下面這段代碼可以實(shí)現(xiàn) UILabel 尺寸固定,

            制作 iPhone 電子書時(shí),如果把大段文字放在 UITextView 或 UILabel 里顯示,是不能分頁的,閱讀時(shí)就像再看一大卷滾不到頭的紙帶,用戶體驗(yàn)很差。下面這段代碼可以實(shí)現(xiàn) UILabel 尺寸固定,根據(jù)文本內(nèi)容和字體動(dòng)態(tài)分頁顯示,電子書方面的應(yīng)用應(yīng)該非常有用。

          // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
          - (void)viewDidLoad {
              [super viewDidLoad];
              
              //
              totalPages = 0;
              currentPage = 0;
              
              //
              textLabel.numberOfLines = 0;
              
              //
              if (!text) {
                  // 從文件里加載文本串
                  [self loadString];
                  
                  // 計(jì)算文本串的大小尺寸
                  CGSize totalTextSize = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
                                                   constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
                                              lineBreakMode:UILineBreakModeWordWrap];

                  // 如果一頁就能顯示完,直接顯示所有文本串即可。
                  if (totalTextSize.height < textLabel.frame.size.height) {
                      textLabel.text = text;
                  }
                  else {
                      // 計(jì)算理想狀態(tài)下的頁面數(shù)量和每頁所顯示的字符數(shù)量,只是拿來作為參考值用而已!
                      NSUInteger textLength = [text length];
                      referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1;
                      referCharatersPerPage = textLength/referTotalPages;
                      
                      // 申請最終保存頁面NSRange信息的數(shù)組緩沖區(qū)
                      int maxPages = referTotalPages;
                      rangeOfPages = (NSRange *)malloc(referTotalPages*sizeof(NSRange));
                      memset(rangeOfPages, 0x0, referTotalPages*sizeof(NSRange));
                      
                      // 頁面索引
                      int page = 0;
                      
                      for (NSUInteger location = 0; location < textLength; ) {
                          // 先計(jì)算臨界點(diǎn)(尺寸剛剛超過UILabel尺寸時(shí)的文本串)
                          NSRange range = NSMakeRange(location, referCharatersPerPage);
                          
                          // reach end of text ?
                          NSString *pageText;
                          CGSize pageTextSize;
                          
                          while (range.location + range.length < textLength) {
                              pageText = [text substringWithRange:range];
                              
                              pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
                                                  constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
                                                      lineBreakMode:UILineBreakModeWordWrap];
                              
                              if (pageTextSize.height > textLabel.frame.size.height) {
                                  break;
                              }
                              else {
                                  range.length += referCharatersPerPage;
                              }
                          }
                          
                          if (range.location + range.length >= textLength) {
                              range.length = textLength - range.location;
                          }
                          
                          // 然后一個(gè)個(gè)縮短字符串的長度,當(dāng)縮短后的字符串尺寸小于textLabel的尺寸時(shí)即為滿足
                          while (range.length > 0) {
                              pageText = [text substringWithRange:range];
                              
                              pageTextSize = [pageText sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE_MAX]
                                                  constrainedToSize:CGSizeMake(textLabel.frame.size.width, CGFLOAT_MAX)
                                                      lineBreakMode:UILineBreakModeWordWrap];
                              
                              if (pageTextSize.height <= textLabel.frame.size.height) {
                                  range.length = [pageText length];
                                  break;
                              }
                              else {
                                  range.length -= 2;
                              }
                          }
                          
                          // 得到一個(gè)頁面的顯示范圍
                          if (page >= maxPages) {
                              maxPages += 10;
                              rangeOfPages = (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
                          }
                          rangeOfPages[page++] = range;
                          
                          // 更新游標(biāo)
                          location += range.length;
                      }

                      // 獲取最終頁面數(shù)量
                      totalPages = page;
                      
                      // 更新UILabel內(nèi)容
                      textLabel.text = [text substringWithRange:rangeOfPages[currentPage]];
                  }
              }
              
              // 顯示當(dāng)前頁面進(jìn)度信息,格式為:"8/100"
              pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
          }


          ////////////////////////////////////////////////////////////////////////////////////////
          // 上一頁
          - (IBAction)actionPrevious:(id)sender {
              if (currentPage > 0) {
                  currentPage--;
                  
                  NSRange range = rangeOfPages[currentPage];
                  NSString *pageText = [text substringWithRange:range];
                  
                  textLabel.text = pageText;

                  //
                  pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
              }
          }

          ////////////////////////////////////////////////////////////////////////////////////////
          // 下一頁
          - (IBAction)actionNext:(id)sender {
              if (currentPage < totalPages-1) {
                  currentPage++;
                  
                  NSRange range = rangeOfPages[currentPage];
                  NSString *pageText = [text substringWithRange:range];
                  
                  textLabel.text = pageText;
                  
                  //
                  pageInfoLabel.text = [NSString stringWithFormat:@"%d/%d", currentPage+1, totalPages];
              }
          }

          posted on 2010-09-13 10:01 seal 閱讀(213) 評(píng)論(0)  編輯  收藏 所屬分類: iPhone
          主站蜘蛛池模板: 阜新市| 武胜县| 通州市| 西林县| 称多县| 湖北省| 潮安县| 韶山市| 外汇| 铁岭市| 武汉市| 措美县| 庄浪县| 大厂| 福建省| 额济纳旗| 兴和县| 大同县| 商丘市| 康定县| 门源| 南汇区| 成武县| 霍城县| 闻喜县| 肥东县| 绥中县| 子长县| 麟游县| 丹棱县| 禹城市| 壤塘县| 佳木斯市| 容城县| 芒康县| 彭泽县| 雷波县| 荃湾区| 县级市| 怀柔区| 垫江县|