您的位置:首页 > 产品设计 > UI/UE

UIPageViewController制作小说翻页效果

2016-09-27 17:06 393 查看
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的欢迎交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: