<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
    主站蜘蛛池模板: 亚洲精品无码久久久久sm| 亚洲国产精品热久久| 国产性生大片免费观看性| 亚洲国产精品自在在线观看| 四虎在线最新永久免费| 亚洲欧美自偷自拍另类视| 亚洲AV伊人久久青青草原| 国产精品偷伦视频观看免费| 亚洲一级毛片免费观看| 亚洲国产成人精品久久久国产成人一区二区三区综 | 日韩激情淫片免费看| a毛片成人免费全部播放| 亚洲中文字幕久在线| 亚洲伊人久久综合影院| 无码国产精品一区二区免费虚拟VR| 国产亚洲精品成人久久网站| 亚洲天天做日日做天天欢毛片 | 亚洲熟妇av一区二区三区漫画| 99久久久国产精品免费牛牛四川 | 永久免费AV无码国产网站| 一级一黄在线观看视频免费| 亚洲免费电影网站| 免费人成在线观看视频播放| 最近免费字幕中文大全视频| 无码 免费 国产在线观看91| 亚洲成AV人综合在线观看 | 亚洲综合中文字幕无线码| 亚洲线精品一区二区三区影音先锋 | 99在线观看精品免费99| 亚洲黄片手机免费观看| 亚洲精品国产摄像头| 亚洲资源在线观看| 国产91精品一区二区麻豆亚洲| 成人毛片免费网站| 久艹视频在线免费观看| 一边摸一边桶一边脱免费视频| 亚洲综合小说另类图片动图| 老色鬼久久亚洲AV综合| 亚洲国产综合久久天堂| 日本免费人成黄页网观看视频| 在线观看视频免费完整版|