IOS------电子书基本创建

一、通过创建EBookView类,继承于UIView,加载电子书

1.给电子书添加几个属性:

//接收外部传递过来的数据
@property (nonatomic, copy) NSString *text;
//设置字体
@property (nonatomic, strong) UIFont *font;
//是否需要动画
@property (nonatomic, assign) BOOL animated;

2.在.m文件里面完成对电子书的显示和操作

(1)创建UILabel显示电子书

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if(self != nil){
        //创建label用于显示文本信息
        self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        //设置背景颜色
        _label.backgroundColor = [UIColor whiteColor];
        //取消label的单行显示
        _label.numberOfLines = 0;
        //设置电子书的字体为本身字体
        _label.font = self.font;
        //将电子书显示
        [self addSubview:_label];   
        //不能在这里完成(获取第一页的内容 显示出来)因为initWithFrame的时候text还没有数据
        //初始化数组
        self.pageRangesArray = [NSMutableArray array]; 
        self.animated = YES;
    }
    return self;
}

2.获取第一页内容,重写set方法

- (void)setText:(NSString *)aText{
    _text = [aText copy];
    //显示第一页的内容
    self.label.font = self.font;
    //计算页数
    NSRange firstPageRange = [self calculatePageRange:0];
    self.label.text = [self.text substringWithRange:firstPageRange];
}

3.重写font的get方法

//重写font的get方法
- (UIFont *)font{
    if(_font == nil){
        //外部没有设置  给一个默认值
        self.font = [UIFont systemFontOfSize:16];
    }
    return _font;
}

4.显示电子书章节内容

//计算之前得确保是有数据的
- (NSRange)calculatePageRange:(NSInteger)page{
    NSRange range = NSMakeRange(0, 0);
    //将上一页的range拿出来
    if (page > 0){
        NSValue *rgValue = [self.pageRangesArray objectAtIndex:page-1];
        NSRange preRange = [rgValue rangeValue];  
        //记录page也对应的起始位置
        range.location = preRange.location + preRange.length;
    } 
    for (int i = 0; i < self.text.length; i++) {
        //改变length的值
        range.length++;     
        //获取当前这个range对应子字符串
        NSString *subString = [self.text substringWithRange:range];     
        //计算subString的高度
        CGSize realSize = [subString boundingRectWithSize:CGSizeMake(self.label.bounds.size.width, 2000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.font} context:nil].size;   
        //判断是否超过这个显示的高度了
        if (realSize.height > self.label.bounds.size.height){
            //让range保存这一页的长度
            range.length --;
            //保存这个range
            NSValue *rgValue = [NSValue valueWithRange:range];
            [self.pageRangesArray addObject:rgValue];
             return range;
        }
    }
    //最后一页
    if(range.length > 0){
        //保存这个range
        NSValue *rgValue = [NSValue valueWithRange:range];
        [self.pageRangesArray addObject:rgValue];     
        return range;
    }else{
        return NSMakeRange(0, 0);
    }
}

5.点击事件开始

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //获取UITouch对象
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self]; 
    NSRange currentPageRange = [[self.pageRangesArray objectAtIndex:_currentPage] rangeValue];
    //判断上一页还是下一页
    if (location.x > self.center.x){
        //下一页
        //判断是否越界了
        if (currentPageRange.location + currentPageRange.length < self.text.length){
            [self changePage:_currentPage+1];
        }
    } else{
        //上一页
        if (_currentPage > 0){
            [self changePage:_currentPage-1];
        }
    }
}

6.翻书

//切换页面 如果有了就不用加载  如果没有就需要加载
- (void)changePage:(NSInteger)page{
    //判断数组里面有没有
    NSRange range;
    if (page > self.pageRangesArray.count-1){
        //需要计算下一页的内容
        range = [self calculatePageRange:page];
        if (self.animated){
            [self animateWithType:kAnimationTypeUp];
        }
    } else{
        //数组里面已经计算过了 不需要计算 直接拿出来使用
        range = [[self.pageRangesArray objectAtIndex:page] rangeValue];
        if (self.animated){
            [self animateWithType:kAnimationTypeDown];
        }
    }
    self.currentPage = page;
    self.label.text = [self.text substringWithRange:range];
}

7.翻书的效果动画

- (void)animateWithType:(kAnimationType)type{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    if (type == kAnimationTypeUp){
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self cache:NO];
    } else{
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self cache:NO];
    }
    [UIView commitAnimations];
}

二、在主界面设置电子书

1.懒加载电子书,需要时再创建

#pragma mark ------- initUI ---------
- (void)initUI{
    //设置标题
    self.title = @"电子书";   
    //设置背景颜色
    self.view.backgroundColor = [UIColor whiteColor];    
    //创建一个电子书
    EBookView *bookView = [[EBookView alloc] initWithFrame:CGRectMake(0, 20+44, self.view.bounds.size.width, self.view.bounds.size.height - 20-44)];
    bookView.text = [self loadData];
    bookView.font = [UIFont systemFontOfSize:16];
    [self.view addSubview:bookView];
}

2.加载电子书,获取路径

- (NSString *)loadData{
    //从文件读取数据
    //获取路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"登山拜师.txt" ofType:nil];  
    //读取文件的内容
    return [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
}

猜你喜欢

转载自blog.csdn.net/psn1028/article/details/83716466
今日推荐