iOS篇—Demo4—电子书

Demo4—电子书

1.创建一个txt文本文件,找一张背景图片,并放入工程中
2.搭建界面

  • 将电子书内容框入一个label中
@property(nonatomic, strong) UILabel *bookLabel;
  • 设置边框属性
//初始化label的大小、位置
self.bookLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, self.view.frame.size.width - 20, self.view.frame.size.height - 100)];

//设置边框颜色
_bookLabel.layer.borderColor = [UIColor blackColor].CGColor;

//设置边框线的像素
_bookLabel.layer.borderWidth = 2;

//设置字体 和下面进行计算的字体要一致
_bookLabel.font = [UIFont systemFontOfSize:20];

//设置显示行数
_bookLabel.numberOfLines = 0;

//设置label的背景图片
_bookLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"电子书背景.jpg"]];

3.读取文件内容

  • 定义一个字符串属性变量用来存储电子书的内容
@property(nonatomic, strong) NSString *text;
  • 开始读取文件
- (void)loadData{
    //1.获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"电子书.txt" ofType:nil];

    //2.读取文件内容
    NSError *error = nil;
    self.text = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

    //3.判断读取是否正确
    if (error != nil) {
        exit(EXIT_SUCCESS);
    } 
}

4.计算每一页的内容显示范围,用range表示,并把算出的范围存入一个可变数组

@property(nonatomic, strong) NSMutableArray *pageRangesArray;
//初始化pageRangesArray
self.pageRangesArray = [NSMutableArray array];

NSRange range;//location  length
for (int i = 0; i < _text.length; i++) {
    //range.length加一
    range.length++;
    
    //获取range对应的子字符串
    NSString *subStr = [_text substringWithRange:range];
    
    //计算这个字符串的高度
    CGRect rect = [subStr boundingRectWithSize:CGSizeMake(self.view.frame.size.width - 20, 2000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]} context:nil];

	//字符串围成的矩形的大小
    CGSize realSize = rect.size;
    
    //判断当前这些字符串的高度有没有超过一个屏幕的大小
    if (realSize.height > self.view.frame.size.height - 100) {
        //超出范围 这个字符是下一页的 当前页的字符长度计算完毕
        range.length --;
        
        //把结构体存入数组 结构体必须封装为NSValue对象
        [self.pageRangesArray addObject:[NSValue valueWithRange:range]];
        
        //更改下一页的起始点
        range.location = range.location + range.length;
        
        //重设length
        range.length = 0;
    }
}

5.由于最后一页的内容不一定会满足大于屏幕大小这个条件,可能不会存入数组,最终不会显示出来,所以需要保存最后一页

[self.pageRangesArray addObject:[NSValue valueWithRange:range]];

6.翻页,点击屏幕左边,向前翻一页,点击屏幕右边,向后翻一页

  • 首先给屏幕添加一个手势,点击屏幕时触发一个翻页方法
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changePage:)];
  • 翻页方法
- (void)changePage:(UITapGestureRecognizer *)tap{
    //获取点的坐标
    CGPoint location = [tap locationInView:self.view];
    //添加翻页动画
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    //判断是左边点 右边点
    if (location.x < 0.5 * self.view.frame.size.width) {
        //左边 切换上一页
        if (_currentPage > 0) {
            _currentPage--;
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_bookLabel cache:YES];
        }
    } else{
        //右边 切换下一页
        if (_currentPage < _pageRangesArray.count - 1) {
            _currentPage++;
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:_bookLabel cache:YES];
        }
    }
    //显示当前页的内容
    //将结构体的NSRange封装成对象NSValue
    NSValue *rangeV = [_pageRangesArray objectAtIndex:_currentPage];
    //解封装
    NSRange range = [rangeV rangeValue];
    NSString *string = [_text substringWithRange:range];
    _bookLabel.text = string;
    //提交翻页动画
    [UIView commitAnimations];
}

  • 设置手势为单击
tap.numberOfTapsRequired = 1;
  • 把手势添加到self.view上
[self.view addGestureRecognizer:tap];

完整代码

#import "ViewController.h"

@interface ViewController ()
@property(nonatomic, strong) UILabel *bookLabel;
//电子书的内容
@property(nonatomic, strong) NSString *text;
//保存每一页的范围 range值
@property(nonatomic, strong) NSMutableArray *pageRangesArray;
//记录当前是第几页
@property(nonatomic, assign) NSInteger currentPage;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadData];
    [self initUI];
}

//初始化界面
- (void)initUI{
    self.bookLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, self.view.frame.size.width - 20, self.view.frame.size.height - 100)];
    //设置边框颜色
    _bookLabel.layer.borderColor = [UIColor blackColor].CGColor;
    //设置边框线的像素
    _bookLabel.layer.borderWidth = 2;
    //设置字体 和下面进行计算的字体要一致
    _bookLabel.font = [UIFont systemFontOfSize:20];
    //设置显示行数
    _bookLabel.numberOfLines = 0;
    //设置label的背景图片
    _bookLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"电子书背景.jpg"]];
    //把从文件中读取的内容加到label上
    //_bookLabel.text = _text;
    [self.view addSubview:_bookLabel];
    
    //显示第一页内容
    //range封装在NSValue中
    NSValue *rangeV = [_pageRangesArray objectAtIndex:0];
    NSRange range = [rangeV rangeValue];
    NSString *string = [_text substringWithRange:range];
    _bookLabel.text = string;
    
    //给界面self.View添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changePage:)];
    //设置单击
    tap.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:tap];
}

- (void)changePage:(UITapGestureRecognizer *)tap{
    //获取点的坐标
    CGPoint location = [tap locationInView:self.view];
    
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    //判断是左边点 右边点
    if (location.x < 0.5 * self.view.frame.size.width) {
        //左边 切换上一页
        if (_currentPage > 0) {
            _currentPage--;
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_bookLabel cache:YES];
        }
    } else{
        //右边 切换下一页
        if (_currentPage < _pageRangesArray.count - 1) {
            _currentPage++;
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:_bookLabel cache:YES];
        }
    }
    //显示当前页的内容
    //将结构体的NSRange封装成对象NSValue
    NSValue *rangeV = [_pageRangesArray objectAtIndex:_currentPage];
    //解封装
    NSRange range = [rangeV rangeValue];
    NSString *string = [_text substringWithRange:range];
    _bookLabel.text = string;
    
    [UIView commitAnimations];
}

//读取文件内容
- (void)loadData{
    //初始化pageRangesArray
    self.pageRangesArray = [NSMutableArray array];
    //1.获取文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"电子书.txt" ofType:nil];

    //2.读取文件内容
    NSError *error = nil;
    self.text = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];

    //3.判断读取是否正确
    if (error != nil) {
        NSLog(@"error:%@", error);
        exit(EXIT_SUCCESS);
    }
    
    //计算每一页的内容显示的范围
    NSRange range;//location  length
    for (int i = 0; i < _text.length; i++) {
        //range.length加一
        range.length++;
        //获取range对应的子字符串
        NSString *subStr = [_text substringWithRange:range];
        //计算这个字符串的高度
        CGRect rect = [subStr boundingRectWithSize:CGSizeMake(self.view.frame.size.width - 20, 2000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]} context:nil];
        CGSize realSize = rect.size;
        //判断当前这些字符串的高度有没有超过一个屏幕的大小
        if (realSize.height > self.view.frame.size.height - 100) {
            //超出范围 这个字符是下一页的 当前页的字符长度计算完毕
            range.length --;
            //把结构体存入数组 结构体必须封装为NSValue对象
            [self.pageRangesArray addObject:[NSValue valueWithRange:range]];
            //更改下一页的起始点
            range.location = range.location + range.length;
            //重设length
            range.length = 0;
        }
    }
    
    //保存最后一页
    [self.pageRangesArray addObject:[NSValue valueWithRange:range]];
    //NSLog(@"%@",_text);
//    NSFileHandle *fp = [NSFileHandle fileHandleForReadingAtPath:@"电子书.txt"];
//    NSData *data = [fp readDataOfLength:50];
//    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//
//    data = [fp readDataOfLength:50];
//    str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//
//    data = [fp readDataToEndOfFile];
//    str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//    NSLog(@"str = %@",str);
}
@end

猜你喜欢

转载自blog.csdn.net/weixin_43733988/article/details/88381907