<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

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

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

      制作 iPhone 電子書時,如果把大段文字放在 UITextView 或 UILabel 里顯示,是不能分頁的,閱讀時就像再看一大卷滾不到頭的紙帶,用戶體驗很差。下面這段代碼可以實現(xiàn) UILabel 尺寸固定,根據(jù)文本內(nèi)容和字體動態(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];
            
            // 計算文本串的大小尺寸
            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 {
                // 計算理想狀態(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; ) {
                    // 先計算臨界點(尺寸剛剛超過UILabel尺寸時的文本串)
                    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;
                    }
                    
                    // 然后一個個縮短字符串的長度,當縮短后的字符串尺寸小于textLabel的尺寸時即為滿足
                    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;
                        }
                    }
                    
                    // 得到一個頁面的顯示范圍
                    if (page >= maxPages) {
                        maxPages += 10;
                        rangeOfPages = (NSRange *)realloc(rangeOfPages, maxPages*sizeof(NSRange));
                    }
                    rangeOfPages[page++] = range;
                    
                    // 更新游標
                    location += range.length;
                }

                // 獲取最終頁面數(shù)量
                totalPages = page;
                
                // 更新UILabel內(nèi)容
                textLabel.text = [text substringWithRange:rangeOfPages[currentPage]];
            }
        }
        
        // 顯示當前頁面進度信息,格式為:"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 閱讀(212) 評論(0)  編輯  收藏 所屬分類: iPhone
    主站蜘蛛池模板: 亚洲黄色网址在线观看| 亚洲人成小说网站色| 最近中文字幕高清免费中文字幕mv| 亚洲性天天干天天摸| 成人a免费α片在线视频网站| 日韩a毛片免费观看| 久久精品国产精品亚洲毛片| 国产jizzjizz免费看jizz| 免费观看成人久久网免费观看| 亚洲永久在线观看| 国产成人亚洲精品狼色在线| 一色屋成人免费精品网站| yellow视频免费在线观看| 亚洲国产综合第一精品小说| 亚洲人成色7777在线观看不卡 | 亚洲AV日韩AV天堂久久| 免费毛片在线播放| 91精品免费不卡在线观看| 免费观看亚洲人成网站| 亚洲视频在线观看不卡| 色噜噜AV亚洲色一区二区| 破了亲妺妺的处免费视频国产| 国产激情免费视频在线观看 | 亚洲国产精品成人AV在线| 亚洲av中文无码乱人伦在线r▽| 国产免费黄色大片| 久久久久久久免费视频| A片在线免费观看| 黄网站色成年片大免费高清| 亚洲av无码一区二区三区天堂古代| 亚洲午夜国产精品无码老牛影视| 免费看美女被靠到爽的视频| 最近中文字幕免费2019| a级毛片毛片免费观看永久| 免费在线观看亚洲| 亚洲av无码成人影院一区| 亚洲国产精品综合久久久| 亚洲国产精品无码久久久秋霞2 | 日韩精品无码永久免费网站| 亚洲人成自拍网站在线观看| 亚洲图片校园春色|