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;//重设lengthrange.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封装成对象NSValueNSValue *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封装成对象NSValueNSValue *rangeV = [_pageRangesArray objectAtIndex:_currentPage];//解封装NSRange range = [rangeV rangeValue];NSString *string = [_text substringWithRange:range];_bookLabel.text = string;[UIView commitAnimations];
}//读取文件内容
- (void)loadData{//初始化pageRangesArrayself.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  lengthfor (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;//重设lengthrange.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

iOS篇—Demo4—电子书相关推荐

  1. 集成 jpush-react-native 常见问题汇总 ( iOS 篇)

    给 iOS 应用添加推送功能是一件比较麻烦的事情,本篇文章收集了集成 jpush-react-native 的常见问题,目的是为了帮助用户更好地排查问题 1.收不到推送 确保是在真机上测试,而不是在模 ...

  2. iOS面试准备 - ios篇

    iOS面试准备 - ios篇 ios面试准备 - objective-c篇 ios面试准备 - 网络篇 IOS面试准备 - C++篇 iOS面试准备 - 其他篇 运行时 https://juejin. ...

  3. cocos creator接入微信登陆sdk ios篇

    cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在" ...

  4. Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果

    Delphi 10.4.2是最新版本的跨平台本机应用开发工具,一套代码可编译到五个操作系统上:iOS.Android.Windows.macOS 和 Linux: 本代码仅仅数十行即可轻松实现Andr ...

  5. APP逆向分析之钉钉抢红包插件的实现-iOS篇

    花费了很多天的原创文章,转载请注明出处https://yohunl.com/ding-ding-qiang-hong-bao-cha-jian-iospian/ ,谢谢! 网络上关于微信红包的分析文章 ...

  6. ios解析txt电子书

    ios解析txt电子书 昨天上线新版本因为Other-Other账号审核被拒了,估计要等待几天了,正好抽时间把最近写的东西整理一下. 附上APP地址: 一阅阅读 有想看小说的小伙伴可以试下 支持换源 ...

  7. GJM:移动App入侵与逆向破解技术-iOS篇 【转载】

    GJM:移动App入侵与逆向破解技术-iOS篇 [转载] 转载: URL http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您 ...

  8. 高德APP启动耗时剖析与优化实践(iOS篇)

    来自:高德技术 前言 最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为 ...

  9. 梳理19年上半年图文记录笔记(ios篇)

    这篇笔记,是自己学习的学习大杂烩,主要用于记录,方便自己查找,其中有些,现在自己看起来都有点好笑,因为错的太低级了,不过这也是成长,后面会梳理好的 一.极客和我赢职场普及的一些基础概念 ##1.环境搭 ...

最新文章

  1. python自定义函数数据分析_Python实现自定义函数的5种常见形式分析
  2. 老是原罪?技术圈为何不待见大龄企业家
  3. Oracle下载 OPatch
  4. swagger生成错误问题 汇总解决
  5. Java内存模型JMM简单分析
  6. python随机生成6位数验证码
  7. Profinet 协议
  8. 你好,李焕英;再见,唐探3?
  9. pdf签名无效解决办法_谁告诉你PDF不能修改了?我不仅可以直接编辑,还能随便转化格式!...
  10. 整理全网可视化大屏有关资料,学习大屏设计,大屏原型参考,大屏设计参考
  11. nas 软件 性能测试,NAS性能测试器(NAS performance tester)
  12. xm-select使用
  13. Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
  14. Thinkphp5乐兔CRM之Mockplus 原型设计的登录页
  15. 泛型是什么,为什么要用泛型
  16. h5游戏间接转换为微信小游戏
  17. 晶振PPM,PPB单位换算
  18. perl语言中的.pm文件和.pl文件区别
  19. CRM系统能给销售人员带来哪些帮助?以下关键别忽略
  20. sicily 1214

热门文章

  1. OPENCV420版本CV_INTER_LINEAR
  2. setTimeout() 和 setInterval 定时器的使用(带例题)
  3. 成都瀚德科技C++高级开发工程师(windows方向)的面试题目
  4. 求阶乘的累和​​​​​​​​​​​​​​​​​​​​​(matlab版代码)
  5. RabbitMQ的Exchange 模式之topic(主题模式)
  6. 『三分钟学分析』:品牌知名度分析实例
  7. SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port
  8. Software is preventing Firefox from safely connecting to this site
  9. Wonderware IDE:Failed to deploy PlatformName: Can not communicate with remote node
  10. JFreeChart 生成饼图(标准饼图、3D饼图)