美女程序媛写的 iOS总结:项目中的各种小坑汇总

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看92 回复回复2 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 92|回复: 2
收起左侧

美女程序媛写的 iOS总结:项目中的各种小坑汇总

[复制链接]
firefighter 发表于 2016-10-23 22:26:15 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑

这并不是我的第一篇,在这之前我已经写了5篇。。。。文章算不上,只是做个记录而已,由于篇幅太小,被我早早取消了亮相的资格,毕竟跟那些专职、兼职的作家和文字爱好者相比,人家动辄几千字的文稿,而我一个小小的iOS程序媛,上次写作文还是高考的事儿。废话不多说,说也没墨水,还是赶紧上干货吧!

美女程序媛写的 iOS总结:项目中的各种小坑汇总 2

美女程序媛写的 iOS总结:项目中的各种小坑汇总 - 敏捷大拇指 - 美女程序媛写的 iOS总结:项目中的各种小坑汇总 2





目录

  • 字符串转JSON
  • 图片拉伸
  • Label文字自适应frame
  • 时间间隔24小时(这个之前有错误,已更正)
  • 两个日期的 比较
  • UIView添加阴影效果无效
  • 隐藏状态栏





1、字符串转JSON

在网络请求时,如果服务端返回的是字符串,那么就需要我们自己封装一个类,来将请求下来的字符串转换成JSON对象。,从而存入模型中。

注意: 字符串中如果含有一些特殊转意符(如\n、\t等),需要先对字符串进行处理。

示例代码如下:

[Objective-C] 纯文本查看 复制代码
+(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{
if (jsonString == nil) {
    return nil;
}//    jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\\\" withString:@""];
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;}





2、图片拉伸

示例代码如下:

[Objective-C] 纯文本查看 复制代码
    UIImageView *rightImagV = [[UIImageView alloc]init];
    UIImage* img=[UIImage imageNamed:@"tu_text_Values"];//原图
    UIEdgeInsets edge=UIEdgeInsetsMake(5, myScalWidth(100), 5,myScalWidth(30));
    //UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
    //UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图
    img= [img resizableImageWithCapInsets:edge resizingMode:UIImageResizingModeStretch];
    rightImagV.image = img;
    [rightImagV sizeToFit];
    rightImagV.width = myScalWidth(73)+scoreL.width+myScalWidth(20);
    rightImagV.x = SCREEN_WIDTH - myScalWidth(10)-rightImagV.width;
    rightImagV.centerY = CGRectGetMidY(proV.frame);
    [topView addSubview:rightImagV];
    scoreL.x = myScalWidth(83);
    scoreL.centerY = rightImagV.height*0.5;
    [rightImagV addSubview:scoreL];





3、Label文字自适应frame

Label文字自适应frame,目前知道的有三种方式:

示例代码如下:



3.1、方式一

推荐此方式,此方式能够获取高度,实现自动换行、行距设置。

[Objective-C] 纯文本查看 复制代码
UILabel * infoLab=[[UILabel alloc] init];//    infoLab.text=self.infoText;    infoLab.font=[UIFont systemFontOfSize:myScalFont(28)];    infoLab.textColor=RGB(102, 102, 102, 1);    infoLab.numberOfLines=0;    NSMutableAttributedString *infoStr = [HP_NString createAttributeStringWithText:self.infoText LineSpace:myScalHeight(22) andFont:infoLab.font andColor:infoLab.textColor];    infoLab.attributedText = infoStr;    CGSize infoSize = [HP_NString sizeOfText:self.infoText withFont:infoLab.font andSize:CGSizeMake(bgView.valueOfW-myScalWidth(22)*2, 1000) andLineSpace:myScalHeight(22) andColor:infoLab.textColor];    infoLab.width=infoSize.width;    infoLab.height=infoSize.height;    infoLab.x=typeLab.valueOfX;    infoLab.y=typeLab.valueOfBottomMargin+myScalHeight(24);
[self.view addSubview:infoLab];




3.2、方式二

[Objective-C] 纯文本查看 复制代码
detailLabel.text=correctM.remarkContent;  NSMutableAttributedString *attStr = [HP_NString createAttributeStringWithText:detailLabel.text LineSpace:myScalHeight(14) andFont:[UIFont systemFontOfSize:myScalHeight(23)] andColor:RGB(0, 0, 0, 1)];detailLabel.attributedText=attStr;size = [HP_NString sizeOfText:detailLabel.text withFont:[UIFont systemFontOfSize:myScalFont(23)] andSize:CGSizeMake(detailbgView.valueOfW - myScalWidth(20)*2, SCREEN_HEIGHT) andLineSpace:myScalHeight(14) andColor:RGB(0, 0, 0, 1)];detailLabel.textColor=RGB(0, 0, 0, 1);detailLabel.font=[UIFontsystemFontOfSize:myScalHeight(23)];detailLabel.frame = CGRectMake(myScalWidth(20), myScalHeight(55), detailbgView.valueOfW - myScalWidth(20)*2, size.height); detailbgView.height=size.height+myScalHeight(100);




3.3、方式三

推荐

[Objective-C] 纯文本查看 复制代码
CGFloat detailInfoLabelX=CGRectGetMidX(questImageView.frame);    CGFloat detailInfoLabelW=detailInfoView.width-detailInfoLabelX*2;    UILabel * detailInfoLabel=[[UILabel alloc] init];    detailInfoLabel.numberOfLines=0;    detailInfoLabel.text=@"啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦";    detailInfoLabel.textColor=RGB(102, 102, 102, 1);    detailInfoLabel.font=[UIFont systemFontOfSize:myScalFont(20)];    CGSize detailSize=[detailInfoLabel.text sizeWithFont:detailInfoLabel.font constrainedToSize:CGSizeMake(detailInfoLabelW, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];    detailInfoLabel.x=detailInfoLabelX;    detailInfoLabel.y=0;    detailInfoLabel.width=detailSize.width;    detailInfoLabel.height=detailSize.height;
[detailInfoView addSubview:detailInfoLabel];





4、时间间隔24小时

今天公众号里有位大神给我留言指出这种做法只是间隔了24小时,并不能控制每天弹一次,我看了下确实写的不严谨,当时上面说要求每天弹一次,想当然的就觉得是24小时了,误导了大家 :( 。这儿我暂时先改成间隔24小时,近期项目事情比较多,还没有时间完善判断每天弹出的情况,过几天再更新哈。

示例代码如下:

[Objective-C] 纯文本查看 复制代码
+(void)jumpToVC:(UIViewController *)myVC withSaveParam:(NSString *)saveParam withSaveDate:(NSDate *)saveDate withNavigationController:(UINavigationController *)nav{
//判断参数是否保存
if (saveParam.length>0 && saveParam != nil) {//Y
    YSXLog(@"参数已保存");
}else{//N
    //判断时间是否保存
    if (saveDate != nil) {//Y
        //判断是否超过24小时
        if ([[NSDate date] timeIntervalSinceDate:saveDate]/3600 >24) {//超过24小时

            [nav pushViewController:myVC animated:YES];
        }else{
            YSXLog(@"没有超过24小时");
        }

    }else{//N跳转

      [nav pushViewController:myVC animated:YES];
    }
}}


调用时,由于“所依赖的界面”还没加载完,所以有时不能成功弹出,可以适当延迟弹出时间1秒。

示例代码如下:

[Objective-C] 纯文本查看 复制代码
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * 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];
});





5、两个日期的比较

从服务器以字符串的形式返回两个时间,要求比较两者的大小。

示例代码如下:

[Objective-C] 纯文本查看 复制代码
    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





6、UIView添加阴影效果无效

前几天做功能的时候,给圆角化的view四周加阴影效果,结果搞半天没搞出来,原来是我对view圆角化的时候,除了View.layer.cornerRadius的设置,后面总是习惯地加上View.layer.masksToBounds = YES,剪裁了阴影当然没有了。这么粗心,程序媛当到我这个地步也是醉了。。。




7、隐藏状态栏

一般情况下我们创建界面的时候系统会预留20px空白给顶部状态栏,但是这空白不好看呀,所以我们在对应的控制器里viewDid方法里加上self.automaticallyAdjustsScrollViewInsets = NO,而[[UIApplication sharedApplication]setStatusBarHidden: YES
withAnimation: UIStatusBarAnimationFade]; 是将整个状态栏给隐藏掉了,用户体验效果不好,这里并不提倡。在我处理状态栏的时候发现automaticallyAdjustsScrollViewInsets的方法不起作用,经过上网查询,最终解决了,原来控制器里我将scrollView作为了第一视图, 只要scrollView的第一视图身份取消,automaticallyAdjustsScrollViewInsets方法就奏效了,具体什么原因导致的,我现在还没弄清楚。

美女程序媛写的 iOS总结:项目中的各种小坑汇总 1

美女程序媛写的 iOS总结:项目中的各种小坑汇总 - 敏捷大拇指 - 美女程序媛写的 iOS总结:项目中的各种小坑汇总 1





好了,今天就记录这么多吧,本人现在还是iOS小菜鸟一枚,道行尚浅,如有错误希望各位同行大神善意指出。如果觉得写的不那么辣眼睛,那就动动手指给俺点个,小女子在此谢过, 本文会不定期更新哦




作者:随意_M

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 收起 理由
Anewczs + 10 大赞原创!牛!

查看全部评分

我是90后 发表于 2016-10-24 21:59:15 | 显示全部楼层
妹子加油!
相见不如怀念 发表于 2016-10-26 01:47:07 | 显示全部楼层
发错了内容,还记得更正过来,不错!不要怕错。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表