iOS总结:项目中的各种小坑汇总
一、字符串转JSON
在网络请求时,如果服务端返回的是字符串,那么就需要我们自己封装一个类,将请求下来的字符串转换成json对象,从而存入模型中。
注意: 字符串中如果含有一些特殊转意符(如\n、\t等),需要先对字符串进行处理。
示例代码如下:
+(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{
if (jsonString == nil) {
return nil;
}
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\r" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\n" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\s" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\t" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\v" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\f" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\b" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\a" withString:@""];
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\e" withString:@""];
NSData * jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError * err;
NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if (err) {
YSXLog(@"json解析失败:%@",err);
return nil;
}
return dic;
}
二、图片拉伸
UIImageView *rightImagV = [[UIImageView alloc]init];
UIImage* img=[UIImage imageNamed:@"tu_text_Values"];//原图
UIEdgeInsets edge=UIEdgeInsetsMake(, myScalWidth(), ,myScalWidth());
//UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
//UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图
img= [img resizableImageWithCapInsets:edge resizingMode:UIImageResizingModeStretch];
rightImagV.image = img;
[rightImagV sizeToFit];
rightImagV.width = myScalWidth()+scoreL.width+myScalWidth();
rightImagV.x = SCREEN_WIDTH - myScalWidth()-rightImagV.width;
rightImagV.centerY = CGRectGetMidY(proV.frame);
[topView addSubview:rightImagV];
scoreL.x = myScalWidth();
scoreL.centerY = rightImagV.height*0.5;
[rightImagV addSubview:scoreL];
三、Label文字自适应frame
方式一
推荐此方式,此方式能够获取高度,实现自动换行、行距设置
UILabel * infoLab=[[UILabel alloc] init];
// infoLab.text=self.infoText;
infoLab.font=[UIFont systemFontOfSize:myScalFont()];
infoLab.textColor=RGB(, , , );
infoLab.numberOfLines=;
NSMutableAttributedString *infoStr = [HP_NString createAttributeStringWithText:self.infoText LineSpace:myScalHeight() andFont:infoLab.font andColor:infoLab.textColor];
infoLab.attributedText = infoStr;
CGSize infoSize = [HP_NString sizeOfText:self.infoText withFont:infoLab.font andSize:CGSizeMake(bgView.valueOfW-myScalWidth()*, ) andLineSpace:myScalHeight() andColor:infoLab.textColor];
infoLab.width=infoSize.width;
infoLab.height=infoSize.height;
infoLab.x=typeLab.valueOfX;
infoLab.y=typeLab.valueOfBottomMargin+myScalHeight();
[self.view addSubview:infoLab];
方式二
CGFloat detailInfoLabelX=CGRectGetMidX(questImageView.frame);
CGFloat detailInfoLabelW=detailInfoView.width-detailInfoLabelX*;
UILabel * detailInfoLabel=[[UILabel alloc] init]; detailInfoLabel.numberOfLines=;
detailInfoLabel.text=@"啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦";
detailInfoLabel.textColor=RGB(, , , );
detailInfoLabel.font=[UIFont systemFontOfSize:myScalFont()];
CGSize detailSize=[detailInfoLabel.text sizeWithFont:detailInfoLabel.font constrainedToSize:CGSizeMake(detailInfoLabelW, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];
detailInfoLabel.x=detailInfoLabelX;
detailInfoLabel.y=;
detailInfoLabel.width=detailSize.width;
detailInfoLabel.height=detailSize.height;
[detailInfoView addSubview:detailInfoLabel];
四、时间间隔一天
项目中的需求:控制弹窗弹出次数,要求每天弹出一次即可,写一个类,方便调用
+(void)jumpToVC:(UIViewController *)myVC withSaveParam:(NSString *)saveParam withSaveDate:(NSDate *)saveDate withNavigationController:(UINavigationController *)nav{
//判断参数是否保存
if (saveParam.length> && saveParam != nil) {//Y
YSXLog(@"参数已保存");
}else{//N
//判断时间是否保存
if (saveDate != nil) {//Y
//判断是否超过24小时
if ([[NSDate date] timeIntervalSinceDate:saveDate]/ >) {//超过24小时
[nav pushViewController:myVC animated:YES];
}else{
YSXLog(@"没有超过24小时");
}
}else{//N跳转
[nav pushViewController:myVC animated:YES];
}
}}
调用时,由于“所依赖的界面”还没加载完,所以有时不能成功弹出,可以适当延迟弹出时间1秒
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
EmailViewController * vc = [[EmailViewController alloc] init];
[YSXJumpToVC jumpToVC:vc withSaveParam:[YSXUserInfo sharedYSXUserInfo].addEmail withSaveDate:[YSXUserInfo sharedYSXUserInfo].addEmailDate withNavigationController:self.navigationController];
});
五、两个日期的比较
从服务器以字符串的形式返回两个时间,要求比较两者的大小
NSDateFormatter * df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate * dt1 = [[NSDate alloc] init];
NSDate * dt2 = [[NSDate alloc] init];
//签到拿到的时间
dt1 = [df dateFromString:[YSXUserInfo sharedYSXUserInfo].comentTimeStr1];
//实时获取时间
dt2 = [df dateFromString:[YSXUserInfo sharedYSXUserInfo].comentTimeStr];
NSComparisonResult result = [dt1 compare:dt2];
if (result == NSOrderedDescending) {//dt1>dt2
redView.hidden = NO;
}else{
redView.hidden = YES;
} //当dt1大于dt2时,结果为 NSOrderedDescending
//当dt1等于dt2时,结果为 NSOrderedSame
//当dt1小于dt2时,结果为NSOrderedAscending
六、UIView添加阴影效果无效
给圆角化的view四周加阴影效果,结果搞半天没搞出来,原来是我对view圆角化的时候,除了View.layer.cornerRadius的设置,后面总是习惯地加上View.layer.masksToBounds = YES,剪裁了阴影当然没有了。
七、隐藏状态栏
一般情况下我们创建界面的时候系统会预留20px空白给顶部状态栏,但是这空白不好看呀,所以我们在对应的控制器里viewDidLoad方法里加上self.automaticallyAdjustsScrollViewInsets = NO,而[[UIApplication sharedApplication]setStatusBarHidden:YES
withAnimation:UIStatusBarAnimationFade];是将整个状态栏给隐藏掉了,用户体验效果不好,这里并不提倡。在我处理状态栏的时候发现automaticallyAdjustsScrollViewInsets的方法不起作用,经过上网查询,最终解决了,原来控制器里我将scrollView作为了第一视图, 只要scrollView的第一视图身份取消,automaticallyAdjustsScrollViewInsets方法就奏效了。
OK,今天先总结这几点,错误的地方,希望大神多多指点!
iOS总结:项目中的各种小坑汇总的更多相关文章
- JavaScript中的各种小坑汇总
1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- iOS原生项目中集成React Native
1.本文的前提条件是,电脑上已经安装了CocoaPods,React Native相关环境. 2.使用Xcode新建一个工程.EmbedRNMeituan [图1] 3.使用CocoaPods安装Re ...
- iOS 之项目中遇到的问题总结
昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...
- iOS:项目中疑难Crash问题集锦
项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash ...
- Extjs 项目中常用的小技巧,也许你用得着(2)
接着来,也是刚刚遇到的 panel怎么进行收缩 collapsible: true, 这会panel就会出现这个 点这个就可以收缩了 panel怎么随便拉伸,也就是让那个小黑三角出现 split: t ...
- Extjs 项目中常用的小技巧,也许你用得着(1)
我在项目中遇到的一些知识点: 1.在GridPanel中显示图片,效果 对应的代码实现 { text: '是否启用', width: 80, // xtype: 'checkcolumn', data ...
- 一次 react-router 中遇到的小坑
react-router Link 标签不生效的问题 废话不多说, 直接上问题, 排解过程和答案 现象: 发现 使用 Link 标签没有 元素的样式和效果, 也不能进行跳转 代码如下: render( ...
- BUI Webapp用于项目中的一点小心得
接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...
随机推荐
- 在linux平台实现atosl
➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...
- GitHub实战系列~4.把github里面的库克隆到指定目录+日常使用 2015-12-11
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
- 设计模式(六):控制台中的“命令模式”(Command Pattern)
今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...
- Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)
<Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)> <Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)> 目的:指导项 ...
- Oracle 11g DG配置简明版
环境: 主库A机:在线生产环境,RHEL 6.4 + Oracle 11.2.0.3 备库B机:新增备机,RHEL 6.4 需求: 对生产环境最小影响前提下配置DG备库. 目录: 一.B机安装相同版本 ...
- java多线程--同步屏障CyclicBarrier的使用
CyclicBarrier的概念理解: CyclicBarrier的字面上的意思是可循环的屏障,是java并发包java.util.concurrent 里的一个同步工具类,在我下载的JDK1.6的中 ...
- meta标签
参考:http://www.jb51.net/web/158860.html META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME). 一.HTTP标题信息(HTT ...
- .net请求URL过长,解决方案
<system.web> 节点下加上 <httpRuntime requestValidationMode="2.0" maxQueryStringLength= ...
- TeamCity : Build 基本配置
前文中我们在 TeamCity 中创建了一个项目 HelloApp,并在这个项目中创建了一个名为 HelloAppDailyBuild 的Build 用来编译 demo 程序.本文我们将详细介绍 Bu ...