<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
    主站蜘蛛池模板: 国产精品青草视频免费播放| 亚洲heyzo专区无码综合| 美女视频黄.免费网址| 日韩激情无码免费毛片| 亚洲中文字幕无码av在线| 亚洲精品在线免费观看视频 | free哆啪啪免费永久| 亚洲AV成人精品网站在线播放| 精品一卡2卡三卡4卡免费视频| 亚洲国产精品无码AAA片| 一级毛片免费视频| 亚洲高清在线mv| 97视频热人人精品免费| 亚洲性无码AV中文字幕| 国产免费AV片无码永久免费| 免费看一级一级人妻片 | 国产成人综合亚洲| 亚洲精品第一国产综合境外资源| 国产精品免费在线播放| 久久亚洲AV成人无码电影| 日韩免费a级毛片无码a∨| 国产精品久久亚洲一区二区| 亚洲人成色77777在线观看大| 国产午夜不卡AV免费| 亚洲人成人77777在线播放| 免费看AV毛片一区二区三区| 日韩一区二区三区免费播放| 亚洲区小说区激情区图片区| 最近免费中文字幕mv在线电影 | 亚洲中文字幕在线观看| 最近免费中文字幕大全高清大全1| 亚洲男人的天堂久久精品| 亚洲а∨天堂久久精品| 精品国产免费一区二区三区香蕉| 亚洲情A成黄在线观看动漫软件 | 免费看无码特级毛片| 国产精品亚洲专区在线观看| 亚洲M码 欧洲S码SSS222| 57pao一国产成永久免费| 色www免费视频| 亚洲第一成年人网站|