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;//重设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—电子书相关推荐
- 集成 jpush-react-native 常见问题汇总 ( iOS 篇)
给 iOS 应用添加推送功能是一件比较麻烦的事情,本篇文章收集了集成 jpush-react-native 的常见问题,目的是为了帮助用户更好地排查问题 1.收不到推送 确保是在真机上测试,而不是在模 ...
- iOS面试准备 - ios篇
iOS面试准备 - ios篇 ios面试准备 - objective-c篇 ios面试准备 - 网络篇 IOS面试准备 - C++篇 iOS面试准备 - 其他篇 运行时 https://juejin. ...
- cocos creator接入微信登陆sdk ios篇
cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在" ...
- Delphi 10.4.2 轻松实现Android/IOS txt小说电子书阅读器应用APP翻页效果
Delphi 10.4.2是最新版本的跨平台本机应用开发工具,一套代码可编译到五个操作系统上:iOS.Android.Windows.macOS 和 Linux: 本代码仅仅数十行即可轻松实现Andr ...
- APP逆向分析之钉钉抢红包插件的实现-iOS篇
花费了很多天的原创文章,转载请注明出处https://yohunl.com/ding-ding-qiang-hong-bao-cha-jian-iospian/ ,谢谢! 网络上关于微信红包的分析文章 ...
- ios解析txt电子书
ios解析txt电子书 昨天上线新版本因为Other-Other账号审核被拒了,估计要等待几天了,正好抽时间把最近写的东西整理一下. 附上APP地址: 一阅阅读 有想看小说的小伙伴可以试下 支持换源 ...
- GJM:移动App入侵与逆向破解技术-iOS篇 【转载】
GJM:移动App入侵与逆向破解技术-iOS篇 [转载] 转载: URL http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您 ...
- 高德APP启动耗时剖析与优化实践(iOS篇)
来自:高德技术 前言 最近高德地图APP完成了一次启动优化专项,超预期将双端启动的耗时都降低了65%以上,iOS在iPhone7上速度达到了400毫秒以内.就像产品们用后说的,快到不习惯.算一下每天为 ...
- 梳理19年上半年图文记录笔记(ios篇)
这篇笔记,是自己学习的学习大杂烩,主要用于记录,方便自己查找,其中有些,现在自己看起来都有点好笑,因为错的太低级了,不过这也是成长,后面会梳理好的 一.极客和我赢职场普及的一些基础概念 ##1.环境搭 ...
最新文章
- python自定义函数数据分析_Python实现自定义函数的5种常见形式分析
- 老是原罪?技术圈为何不待见大龄企业家
- Oracle下载 OPatch
- swagger生成错误问题 汇总解决
- Java内存模型JMM简单分析
- python随机生成6位数验证码
- Profinet 协议
- 你好,李焕英;再见,唐探3?
- pdf签名无效解决办法_谁告诉你PDF不能修改了?我不仅可以直接编辑,还能随便转化格式!...
- 整理全网可视化大屏有关资料,学习大屏设计,大屏原型参考,大屏设计参考
- nas 软件 性能测试,NAS性能测试器(NAS performance tester)
- xm-select使用
- Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
- Thinkphp5乐兔CRM之Mockplus 原型设计的登录页
- 泛型是什么,为什么要用泛型
- h5游戏间接转换为微信小游戏
- 晶振PPM,PPB单位换算
- perl语言中的.pm文件和.pl文件区别
- CRM系统能给销售人员带来哪些帮助?以下关键别忽略
- sicily 1214
热门文章
- OPENCV420版本CV_INTER_LINEAR
- setTimeout() 和 setInterval 定时器的使用(带例题)
- 成都瀚德科技C++高级开发工程师(windows方向)的面试题目
- 求阶乘的累和​​​​​​​​​​​​​​​​​​​​​(matlab版代码)
- RabbitMQ的Exchange 模式之topic(主题模式)
- 『三分钟学分析』:品牌知名度分析实例
- SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port
- Software is preventing Firefox from safely connecting to this site
- Wonderware IDE:Failed to deploy PlatformName: Can not communicate with remote node
- JFreeChart 生成饼图(标准饼图、3D饼图)