目录
1.定义设备|屏幕宏
2.定义系统宏
3.初始化问题
4.按钮的与非状态设置
5.表格cell复用的相关问题
6.去掉按钮的“快速点击的bug”
7.过滤掉地址中省份的方法
8.富文本的使用
9.懒加载
10.iOS判断并使用百度地图、高德地图导航
11.iOS开发中让子视图不响应父视图的手势识别器
12.软件研发环境区别
13.因为“类型修饰错误”造成很难查找的天坑
14.注意内存缓存问题
15.时间的处理
16.问题场景:九宫格,hud问题
17.UITextField内容重叠
18.个人页面复用问题
19.Cell的封装
20.GitHub下载Demo
21.表格指定刷新
22.Apple Mach-O Linker Error错误
23.自定义View的步骤(3部曲)
24.循环引用的问题这样理解
25.宏定义(Define.h)
26.头文件(PrefixHeader.pch)
27.实现一个表格视图的动画(下拉旋转)
28.清除文件缓存的方法
29.网络检测
30.关于键盘知识
1.定义设备|屏幕宏
#define IPHONE4 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
#define IPHONE5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
#define IPHONE6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
#define IPHONE6PLUS ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
2.定义系统宏
#define ISIOS8 [[UIDevice currentDevice].systemVersion floatValue]>=8
3.初始化问题(见例子)
在cell中没有加if(!….)来创建_tripOrderView;导致viewdidload时候创建一次;然后请求数据成功后reoloadData时候又创建一次,会出现问题
if (indexPath.section == 0) {
if (!_tripOrderView) {
_tripOrderView = [UToTripOrderView initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 120) IsSimple:NO];
[cell.contentView addSubview:_tripOrderView];
}
在cell里面创建控件时要记得在没有的情况下才去创建,否则在每次表格刷新数据时他又重新创建,造成问题,比如按钮的状态每次都更新到了最初的默认状态,例如:(用非状态来创建)
if (!_arrowBtn) {
_arrowBtn = [[UIButton alloc]init];
[_arrowBtn setImage:[UIImage imageNamed:@"arrowDown"] forState:0];
[_arrowBtn setImage:[UIImage imageNamed:@"arrowUp"] forState:UIControlStateSelected];
[_arrowBtn addTarget:self action:@selector(arrowBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
}
[specialRequestCell.rightView addSubview:_arrowBtn];
4.按钮的与非状态设置
1.按钮通过当前图片判断实现切换,比如求助,比如顺风车的开关
[_switchBtn addTarget:self action:@selector(switchBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
[_switchBtn setImage:[UIImage imageNamed:@"home_bth_pre"] forState:UIControlStateNormal];
// 闪电接单按钮回调
- (void)switchBtnClicked:(UIButton *)sender {
if ([sender.currentImage isEqual:[UIImage imageNamed:@"home_bth_pre"]]) {
[sender setImage:[UIImage imageNamed:@"home_bth"] forState:0];
} else {
[sender setImage:[UIImage imageNamed:@"home_bth_pre"] forState:UIControlStateNormal];
}
}
2.选中与不选中的与非操作:
cell.headImg.highlighted = !cell.headImg.highlighted;
sender.selected = !sender.selected;
5.表格cell复用的相关问题
- cell的复用问题
tableViewCell的复用问题
(1).此方法创建不会有cell复用问题(当每个cell要弄得不一样最好用这种方法创建 )
UToSpecialRequestCell *specialRequestCell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CELL"];
(2).此方法创建会复用
UToSpecialRequestCell *specialRequestCell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
if (!specialRequestCell) {
specialRequestCell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
}
表格复用问题
(1)UToSpecialRequestCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
if (!cell) {
cell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
}
(2)UToSpecialRequestCell *cell = [[UToSpecialRequestCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
两中方法创建:(1)是复用;(2)不复用;用于cell各自自定义,如果自定义却用了第一中,在初始化第一次时应该不会报错,在刷新表格之后会报错,奔溃
命名如cell,和标识符@“CELL”最好其他的cell不一样,以免 引起问题
- cell的标识的使用
方法1)在创建表格时注册,然后显示方法中使用
创建表格:
[_tableView registerClass:[UToInvoiceListCell class] forCellReuseIdentifier:@"UToInvoiceListCell"];
cell 显示中:
- (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
UToInvoiceListCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UToInvoiceListCell"];
return cell;
}
方法2)在封装的cell中写个标示;然后控制器直接在cell显示地方用有标示的创建方法
cell.h 文件
extern NSString * const UToTrainTicketsCellIdentifier;
cell.m 文件
NSString * const UToTrainTicketsCellIdentifier = @"UToTrainTicketsCellIdentifier";
控制器中:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UToTrainTicketsCell *cell = [[UToTrainTicketsCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:UToTrainTicketsCellIdentifier];
if (!cell) {
cell = [tableView dequeueReusableCellWithIdentifier:UToTrainTicketsCellIdentifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UToTrainTicketsModel *model = _searchResultDataSource[indexPath.row];
cell.ticketModel = model;
return cell;
}
- 误以为是cell复用的刷新坑
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
这个局部刷新方法不能写在表格的代理方法中,会二次刷新(本身一进入视图的时候就会刷新的),之后只要有表格刷新,都会重复刷新,(滑动时)会出现cell错乱问题,还有可能因内存过大奔溃;如果是封装的cell中有按钮的block回调话,可以用,因为只是点击时才加载,而不是一直都加载
6.去掉按钮的“快速点击的bug”
- (void)todoSomething:(id)sender {
//在这里做按钮的想做的事情。
[self loadIssueOrderData];
}
// 确定发布订单按钮回调
- (void)issueOrderButtonClicked:(UIButton *)sender {
//先将未到时间执行前的任务取消。
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(todoSomething:) object:sender];
[self performSelector:@selector(todoSomething:) withObject:sender afterDelay:0.18f];
}
7.过滤掉地址中省份的方法(掌握string的方法)
方法一:
positionCity.adress = @“四川省成都市武侯区成汉南路”;改后:成都市武侯区成汉南路
NSRange range = [result.address rangeOfString:@"省"];
if (range.length) {
range.length = range.location+range.length;
range.location = 0;
positionCity.adress = [result.address stringByReplacingCharactersInRange:range withString:@""];
} else {
positionCity.adress = result.address;
}
weakSelf.positionCity = positionCity;
weakSelf.travelRouteView.startLabel.text = positionCity.adress;
[weakSelf.travelRouteView.startLabel setTextColor:[UToColor blackColor]];
weakSelf.travelRouteView.positionCity = positionCity;
方法二:
在doNotWant这个字符集里想写几个过滤的字符就写几个
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"市"];
_orderDetail.srcCity = [[_orderDetail.srcCity componentsSeparatedByCharactersInSet: doNotWant]componentsJoinedByString: @""];
_orderDetail.destCity = [[_orderDetail.destCity componentsSeparatedByCharactersInSet: doNotWant]componentsJoinedByString: @""];
cell.subLabel.text = [NSString stringWithFormat:@"%@ ⇀ %@",_orderDetail.srcCity,_orderDetail.destCity];
总结:
8.富文本的使用
NSString *text = [NSString stringWithFormat:@"¥%.2f/座 共%@座",[_priceText.text floatValue],_seatNum.text];
NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.2f",[_priceText.text floatValue]]];
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc]initWithString:text];
[attributeString setAttributes:@{NSForegroundColorAttributeName : [UToColor redColor],NSFontAttributeName : [UToFont subTitleFont]} range:range];
NSRange range2 = [text rangeOfString:[NSString stringWithFormat:@"/座 剩%@座",_seatNum.text]];
[attributeString setAttributes:@{NSForegroundColorAttributeName : [UToColor blackColor], NSFontAttributeName : [UToFont titleFont]} range:range2];
_orderSeatInfo.attributedText = attributeString;
NSString *text = [NSString stringWithFormat:@"费用:¥%.2f/座",[_orderDetail.seatPrice floatValue]];
NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.2f",[_orderDetail.seatPrice floatValue]]];
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:text];
[attributedStr setAttributes:@{NSForegroundColorAttributeName : [UToColor redColor]} range:range];
NSRange range2 = [text rangeOfString:[NSString stringWithFormat:@"座"]];
[attributedStr setAttributes:@{NSForegroundColorAttributeName : [UToColor blackColor],NSFontAttributeName : [UIFont systemFontOfSize:11]} range:range2];
_tripOrderView.priceLabel.attributedText = attributedStr;
NSString *text = [NSString stringWithFormat:@"¥%.1f/座",_journey.seatPrice];
NSRange range = [text rangeOfString:[NSString stringWithFormat:@"%.1f",_journey.seatPrice]];
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
[attributeString setAttributes:@{NSForegroundColorAttributeName : [UIColor redColor], NSFontAttributeName : [UToFont maxTitleFont]} range:range];
cell.rightLabel.attributedText = attributeString;
- 复杂的例子1如图:
-
复杂的例子2如图:
富文本给文字添加下划线
9.懒加载
懒加载方法使用:创建初始化的时候用下划线,任何地方调用的时候用self点语法;self. 语法调用了set与get方法;懒加载只有初始化作用,当调用了self. 语法后相当于懒加载也重写了set方法
项目中遇到过问题:因为懒加载的使用而造成初始化失败,为空。如,顺风车特别要求那个数据要用到默认值(不选的话),这时候需要在初始化地方写默认值,因为用了懒加载,没有走那,没有初始化成功(对懒加载理解不深,以后少用,直接在didLoad里面初始化),造成默认值为空,提交数据为空则报错奔溃。
例子:
懒加载创建表格视图例1:
懒加载创建表格视图例2:
相关链接:https://www.cnblogs.com/mancong/p/5051698.html
10. iOS 判断并使用 百度地图 高德地图 导航(使用URI,不集成sdk)
BOOL hasBaiduMap = NO;
BOOL hasGaodeMap = NO;
if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]) {
hasBaiduMap = YES;
}
if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
hasGaodeMap = YES;
}
if ([@"使用百度地图导航" isEqualToString:title]) {
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin=latlng:%f,%f|name:我的位置&destination=latlng:%f,%f|name:终点&mode=driving",currentLat, currentLon,_shopLat,_shopLon] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ;
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlString]];
} else if ([@"使用高德地图导航" isEqualToString:title]) {
以专车司机端为例
NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&poiname=%@&lat=%f&lon=%f&dev=1&style=2",@"UtoDriver", @"iosamap", _driverJourney.dstName, _driverJourney.latitude,_driverJourney.longtitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlString]];
}
注意事项:例如用高德地图时要在plist文件中添加一个属性:iosamap
http://www.cocoachina.com/ios/20150817/13021.html
高德地图开发平台(如路线规划):http://lbs.amap.com/api/ios-navi-sdk/guide/route-plan/drive-route-plan
打开自带的苹果原生地图:
其中coordinate是当前的经纬度坐标,tolocation.name是目的地名字
iOS调用地图(含各种坐标之间转换)相关链接:https://www.jianshu.com/p/ada613ed5549
iOS坐标转换:https://www.jianshu.com/p/fbf25d379959
11.iOS开发中让子视图不响应父视图的手势识别器
问题描述:
给父视图上添加一个子视图,给父视图添加一个手势识别器UITapGestureRecognizer,点击子视图时,也会触发UITapGestureRecognizer所关联的事件
解决方法:
使用UIGestureRecognizerDelegate的代理方法-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch,将子视图的tap手势屏蔽
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isDescendantOfView:self.listV]) {
return NO;
}
return YES;
}
12.软件研发环境区别
开发环境:开发环境时程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。开发环境的分支,一般是feature分支。
测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器上,是开发环境到生产环境的过度环境。测试环境的分支一般是develop分支,部署到公司私有的服务器或者局域网服务器上,主要用于测试是否存在bug,一般会不让用户和其他人看到,并且测试环境会尽量与生产环境相似。
生产环境: 生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。
总计:三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通产说的真实的环境,最后交给用户的环境。
13.因为“类型修饰错误”造成很难查找的天坑
比如:NSIndex不能assign来修饰,在iphone5及系统在10.0以下会有问题。注意要用strong!!!
同样问题:在消息中心封装的segementView中颜色是对象类型用strong,而不是用assign;造成了内存泄漏(不一定在什么时候就会发生,导致奔溃)!导致问题:测试环境不会有问题,不奔溃,线上环境程序奔溃。
带*号的都是对象,注意具体有些用copy...什么的
正确修饰:@property (nonatomic, strong) NSIndexPath *currIndexPath;
用assign导致奔溃如下图:
14.注意内存缓存问题
比如切换工程分枝的时候出现问题:分享APP时,微信朋友圈文字未显示完整,就是因为缓存问题;解决:clean一下工程即可!
15.时间的处理
系统返回的是时间戳:NSTimeInterval(typedef double NSTimeInterval;double类型)
NSTimeInterval:(后面有很多0 )
类型一:APP用NSString来接收
@property (nonatomic, copy) NSString *departure;// 出发时间
_timeLabel.text = [NSDate dateString9WithDate:[NSDate dateWithTimeIntervalSince1970:[_campusBusTicketModel.departure longLongValue]/1000]];
类型二:用UInt64
@property (nonatomic, assign) UInt64 departure; // 去程发车时间
cell.titleLabel.text = [NSDate dateString9WithDate:[NSDate dateWithTimeIntervalSince1970:_trainFillOrder.departure/1000]];
时间设置年月日:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
//设定时间格式,这里可以设置成自己需要的格式
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//用[NSDate date]可以获取系统当前时间
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
NSDate 转UInt64方法:
UInt64 leaveTime = [self.reservationInfo.leaveTime timeIntervalSince1970];
UInt64转NSString:
NSString *temTimeStr = [NSDate dateString7WithDate:[NSDate dateWithTimeIntervalSince1970:tmSpots.departure/1000]];
NSString转UInt64:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
int64_t i = atoll([_backSrcSpots.departure UTF8String]);
NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSince1970:i/1000]];
cell.timeLB.text = [NSString stringWithFormat:@"%@ 返回",currentDateStr];
获取当前时间:
NSDate * senddate=[NSDate date];
NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init];
[dateformatter setDateFormat:@"yyyyMMddHHmm"];
其中格式可以自定义设置,如可换成:@"yyyy-MM-dd"
NSString * timeStamps=[dateformatter stringFromDate:senddate];
return timeStamps;
备注例子:
后天返的时间戳:1513701600000,去掉最后3位0转换结果如下
直通车:
票务:
其中封装的方法:
联系人:
iOS获取当前时间、一周前时间、比较时间大小、时间戳转换:https://www.jianshu.com/p/23f9c6a0e8f2
时间转换:https://www.jianshu.com/p/43d2b343d7f4
当前时间比较:https://blog.csdn.net/onetagtag/article/details/52243077
补充1:预约到店时间显示:
补充例子2(点金树;有些后台返回的全,多3位,就除以1000即可):
补充3:
补充4:
选择时间以后会在上方显示,这个是字符串,然后根据选择的时间进行数据刷新。现在需要把这个时间以时间戳的方式传给后台(接口时间定义int,但是我以字符串传给他,也能处理;最好以int形式传给后台,参照补充5)
备注:上面*1000表示时间戳精确到毫秒,不乘就是精确到秒;看后台那边处理再具体选择
补充5:
前面页面跳转过来带一个时间(时间是字符串),然后把这个时间以时间戳的方式传给后台(接口时间是int型)
补充6:
问题场景:服务器传回来的是时间戳字符串:@"1698668680",也是用字符串接收@property (nonatomic, copy) NSString *curtime;// 时间戳;现在需要展示成@"2019-01-28"这种字符串。正确做法如图一;错误做法如图二
补充说明:dateFromString这个方法后面跟的字符串必须是:@"2019-01-28"这种格式的字符串;不能是时间戳字符串格式:@"1698668680",这样会取不到值,比如下面图二做法就是错误的,date1是nil空值
16.问题场景
九宫格:扫码拼车时,选择乘车联系人时多次后,程序奔溃!打全局断点,也不走。这时可以通过
这个来查找之前奔溃所记录的;从中看出:Terminated due to memory issue 是内存的原因;然后一边操作一边查看内存的增长情况,测试可以看到内存一直暴涨,没有减;查看代码是因为每次更换人数的时候都要请求价格数据,而请求价格数据时肯定都要转菊花,这时内存就疯涨,而没有释放的原因就是菊花相关的hud没有设置代理,导致每次加载数据转菊花时没有释放内存!!!加上代理即可,要注意此类问题的解决办法:重点是精确定位到“问题的原因,解决过程和方法”
17.UITextField
忘记密码地方使用方法:
封装写了一个cell,里面含有textField,但是外面想让他变成全局的,于是就在外面写了一个全局的textfield然后加到cell里面的textfield;这样造成了响应的时候会有两次键盘,然后字体会一直重叠…下次需要注意
18.复用问题
个人信息页面更改昵称那个地方,因为cell用tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath 创建,复用问题导致加的_nameTextfiled不断重叠,需要注意
19.Cell的封装
初始化是这个方法不是view的初始化(不是alloc,init),要注意,很容易忘记:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier];
if (self) {
self.backgroundColor = [UToColor backWhiteColor];
[self creatUI];
}
return self;
}
20.GitHub下载Demo
从邮箱或者GitHub上下载的demo,如果它的上一级文件是中文名则可能报错(/Users/timefly/Library/Developer/Xcode/DerivedData/EXOCR-fkanigacrinffjgrphf:no such
file……)
21.表格指定刷新
//一个section刷新
NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:2];
[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
//一个cell刷新
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
22. Apple Mach-O Linker Error错误
23.自定义View的步骤(3部曲)
• 1.重写初始化方法 (在里面进行一次性的初始化)
xib :awakeFromNib
纯代码:initWithFrame
• 2.重写layoutSubviews, 在里面布局子控件
• 3.接收外界传入的数据, 重写set方法
24.循环引用的问题这样理解:
比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用(A有一个属性是B对象,属性说明是retain;B有一个属性是A对象,属性说明是retain),现在两个对象的引用计数都增加了1,都变成了2。现在执行[A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1,因为他们互相引用了。这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理
25.宏定义(Define.h)
在这个文件里所定义的宏到处可用
定义屏幕大小(3种写法)
1.self.view.bounds-->满屏
2.define WIDTH self.view.bounds.size.width
define HEIGHT self.view.bounds.size.height
3.define kScreenSize [UIScreen mainScreen].bounds.size
(d前面这里都少写了个#号)
26.头文件(PrefixHeader.pch)
放在这里的头文件到处可用;需要简单配置一哈
需要在项目-->目标-->Build Settings修改Prefix Header的,将其前面那些地址改成 (SRCROOT)/OSClient/PrefixHeader.pch
其中OSClient是项目名字(此是开源中国那个项目的);(SRCROOT)/项目名字/pch文件取的名字(有后缀)
27.实现一个表格视图的动画(下拉旋转)
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
//转动特效
CATransform3D rotation;
rotation = CATransform3DMakeRotation( (90.0*M_PI)/180, 0.0, 0.7, 0.4);
rotation.m34 = 1.0/ -600;
cell.layer.shadowColor = [[UIColor blackColor]CGColor];
cell.layer.shadowOffset = CGSizeMake(10, 10);
cell.alpha = 0;
cell.layer.transform = rotation;
//cell.layer.anchorPoint = CGPointMake(0, 0.5);
[UIView beginAnimations:@"rotation" context:NULL];
[UIView setAnimationDuration:0.8];
cell.layer.transform = CATransform3DIdentity;
cell.alpha = 0.7;
cell.layer.shadowOffset = CGSizeMake(0, 0);
[UIView commitAnimations];
[UIView animateWithDuration:0.5 animations:^{
cell.layer.transform = CATransform3DIdentity;
cell.alpha = 1;
cell.layer.shadowOffset = CGSizeMake(0, 0);
}];
}
28.清除文件缓存的方法
封装清除文件的类:
调用:
另外一种方法清除缓存:
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
, ^{
NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) objectAtIndex:0];
NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath];
for (NSString *p in files) {
NSError *error;
NSString *path = [cachPath stringByAppendingPathComponent:p];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {
BOOL isSuccess = [[NSFileManager defaultManager] removeItemAtPath:path error:&error];
if (isSuccess) {
[SVProgressHUD showInfoWithStatus:@"清除缓存成功"];
}
}
}
});
29.网络检测
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//网络检测
[self monitoerNetworking];
// 显示网络活动指示器
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
// 显示应用程序图标徽章
[UIApplication sharedApplication].applicationIconBadgeNumber = 8;
return YES;
}
//检测网络状况
-(void)monitoerNetworking{
AFNetworkReachabilityManager *manager=[AFNetworkReachabilityManager sharedManager];
//设置网络变更回调
[manager setReachabilityStatusChangeBlock:^ void(AFNetworkReachabilityStatus status) {
NSString *str=nil;
switch (status) {
case AFNetworkReachabilityStatusReachableViaWiFi:
str=@"Wifi";
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
str=@"蜂窝";
case AFNetworkReachabilityStatusNotReachable:
str=@"无法连接";
case AFNetworkReachabilityStatusUnknown:
str=@"未知";
break;
default:
break;
}
MBProgressHUDManager *mar=[[MBProgressHUDManager alloc]initWithView:self.window];
[mar showNoticeMessage:[NSString stringWithFormat:@"当前使用网络:%@",str] duration:1 complection:^{
}];
}];
//开启检测网络
[manager startMonitoring];
}
30.关于键盘知识
常用键盘类型:https://blog.csdn.net/qq_36478920/article/details/78316788