首页 > 代码库 > UIPageViewController制作小说翻页效果

UIPageViewController制作小说翻页效果

demo:https://pan.baidu.com/s/1pL6Kvkn

??是下载地址

说下实现的一些细节:

其实UIPageViewController这个控件还是比较容易理解的主要是设置和实例化对象、然后设置代理并实现就可以了、UIPageViewController下面不会说的太多、主要说下小说章节的分页细节

创建好工程后、创建一个数组主要用于内容的存储

self.contentArray = @[].mutableCopy;  // 章节(测试5章)    [self.contentArray addObject:[self textContent:@"事项"  ofType:@"txt"]];    [self.contentArray addObject:[self textContent:@"事项1" ofType:@"txt"]];    [self.contentArray addObject:[self textContent:@"事项2" ofType:@"txt"]];    [self.contentArray addObject:[self textContent:@"事项3" ofType:@"txt"]];    [self.contentArray addObject:[self textContent:@"事项4" ofType:@"txt"]];        // 标题    [self.titleChapter addObject:@"事项1"];    [self.titleChapter addObject:@"事项2"];    [self.titleChapter addObject:@"事项3"];    [self.titleChapter addObject:@"事项4"];    [self.titleChapter addObject:@"事项5"];

有了内容那么接下来就到章节比较重要的地方了、给每个章节进行分页

分页这里我用一个取巧的方式-----NSTextStorage

把章节内容封进NSTextStorage后利用

NSLayoutManager可以准确分页---而分页的数量是根据你设置frame的大小来计算的、基本是可控的

但是这玩意有个小缺点哦(通过测试发现的,如果你们发现别的缺点别喷)、用它来分页是有个临界点的,排版的时候如果单章内容太多,分页超过18页以上会有卡顿(一般小说单章也不会有那么多页的,基本符合大部分需求)

下面继续上分页部分代码

// 对内容进行排版- (void)contentLayout {    for (int i = 0; i < self.contentArray.count; i++) {        [self createContentPagesChaper:self.contentArray[i]];// 初始化所有数据    }        // 记录标题章节  value -- 章节 key自增    self.correspondingArray = @[].mutableCopy;    [self.correspondingArray addObject:@"0"];    NSInteger value = 0,key = 0;    for (NSString *str in self.chaperArray) {        value ++;        key += [str integerValue];        [self.correspondingArray addObject:[NSString stringWithFormat:@"%ld",(long)key]];        for (NSInteger i = [self.correspondingArray[value-1] integerValue]; i < key; i ++) { // 章节的分页总数对应每一个章节            [self.chaperOfNum setObject:[NSString stringWithFormat:@"%ld",value] forKey:[NSString stringWithFormat:@"%ld",(long)i]];        }    }    }// 初始化所有数据并对内容进行排版- (void)createContentPagesChaper:(NSString *)chaperStr {        NSString *chaperContent = chaperStr;        // 2.将字符串封装到TextStorage中    NSTextStorage *storage = [[NSTextStorage alloc]initWithString:chaperStr];        // 3.为TextStorag添加一个LayoutManager    NSLayoutManager *layoutManager = [[NSLayoutManager alloc]init];    [storage addLayoutManager:layoutManager];    int i = 0;    while ( YES )    {        // 4.将有准确矩形大小的TextContainer添加到LayoutManager上        NSTextContainer *textContainer = [[NSTextContainer alloc]initWithSize:CGSizeMake(sWidth - 40, sHeight-90)];        [layoutManager addTextContainer:textContainer];                // 5.绑定TextContainer到TextView上        self.textView = [[UITextView alloc]initWithFrame:CGRectMake(i * sWidth , 40, sWidth-40, sHeight-90) textContainer:textContainer];        [self.textView setFont:[UIFont systemFontOfSize:self.wordFont]];        self.textView.editable = NO;               i ++;        // 排版结束的判断        NSRange range = [layoutManager glyphRangeForTextContainer:textContainer];  // 此方法用来获取当前TextContainer内的文本Range        [self.paglengArray addObject:[NSString stringWithFormat:@"%ld",range.length]];        if ( range.length + range.location == chaperStr.length )            break;    }    int pag = i;    [self.chaperArray addObject:[NSString stringWithFormat:@"%d",i]]; // 每章节的总页数        for (int i = 0; i < pag; i++) { // 截取字段                NSUInteger lengloc;        if (i == 0) {            lengloc = 0;        }else{            lengloc += [self lengPag:i-1];        }        NSString *temp = [chaperContent substringWithRange:NSMakeRange(lengloc, [self.paglengArray[i] integerValue])];        [self.pageStrings addObject:temp];    }        self.pageContent = [[NSArray alloc] initWithArray:self.pageStrings];    [self.paglengArray removeAllObjects];}- (NSUInteger)lengPag:(NSInteger)num {    return [self.paglengArray[num] integerValue];}

完成这一步基本完成百分80了??(剩下的需求看demo了,demo基本就是一个简单小说)

后面只需要创建一个textView来加载显示内容然后通过UIPageViewController代理来实现翻页

今天就说这么多了,,,具体大家自己看demo了 发现BUG的欢迎交流

UIPageViewController制作小说翻页效果