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

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

    // 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 {
                // 計算理想狀態下的頁面數量和每頁所顯示的字符數量,只是拿來作為參考值用而已!
                NSUInteger textLength = [text length];
                referTotalPages = (int)totalTextSize.height/(int)textLabel.frame.size.height+1;
                referCharatersPerPage = textLength/referTotalPages;
                
                // 申請最終保存頁面NSRange信息的數組緩沖區
                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;
                }

                // 獲取最終頁面數量
                totalPages = page;
                
                // 更新UILabel內容
                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
    主站蜘蛛池模板: 国产精品亚洲片夜色在线| 国产麻豆视频免费观看| 四虎影视免费在线| 亚洲乱码无限2021芒果| 99久久99热精品免费观看国产 | 亚洲精品久久久久无码AV片软件| 国产成人精品免费视频网页大全| 亚洲色图视频在线观看| 亚洲精品国产免费| 亚洲制服丝袜第一页| 成年女人喷潮毛片免费播放| 亚洲色无码专区一区| 国产免费人成视频在线观看| 色五月五月丁香亚洲综合网| 国产v片免费播放| 人成午夜免费大片在线观看| 亚洲日韩中文字幕在线播放| 日本一区午夜艳熟免费| 亚洲经典在线观看| 午夜视频在线在免费| 青娱乐在线视频免费观看| 色久悠悠婷婷综合在线亚洲| 无码人妻久久一区二区三区免费 | 国产成人精品免费视频大全五级| 黄网站色成年片大免费高清| 国产AV无码专区亚洲AV手机麻豆| 免费国产午夜高清在线视频| 久久亚洲私人国产精品vA| 在线看片无码永久免费视频| 国产亚洲欧美在线观看| 亚洲深深色噜噜狠狠爱网站| 在线成人爽a毛片免费软件| 亚洲精品国产首次亮相| 黑人大战亚洲人精品一区| 9277手机在线视频观看免费| 亚洲av永久无码一区二区三区| 国产亚洲精午夜久久久久久| 2021在线永久免费视频| 在线观看国产一区亚洲bd| 亚洲国产精品无码专区| 女性自慰aⅴ片高清免费|