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 阻止点击翻页

是否可以在UIPageViewController中以编程方式翻页?

屏幕关闭时如何在 UIPageViewController 中以编程方式翻页?