UIPageViewController制作小说翻页效果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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制作小说翻页效果的主要内容,如果未能解决你的问题,请参考以下文章
UISplitViewController+UIPageViewController+WKWebView = 有时不能翻页
UIPageViewController - 使用警报验证翻页
是否可以在 UIPageViewController 中以编程方式翻页?
uipageviewcontroller 内的 uiwebview 阻止点击翻页