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