美文网首页iOS相关UI买不来的iOS实用技巧
01-iOS总结:项目中的各种小坑汇总

01-iOS总结:项目中的各种小坑汇总

作者: 随意_M | 来源:发表于2016-10-14 20:05 被阅读861次

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

    目录

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

    一、字符串转JSON

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

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

    示例代码如下:

    +(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;}
    

    二、图片拉伸

    示例代码如下:

        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];
    

    三、Label文字自适应frame

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

    示例代码如下:

    方式一

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

    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];
    
    方式二
     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);
    
    方式三

    推荐

    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];
    

    四、时间间隔24小时

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

    示例代码如下:

    +(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秒

    示例代码如下:

     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];
    });
    

    五、两个日期的比较

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

    示例代码如下:

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

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

    相关文章

      网友评论

      • b93e8aa834f1:妹纸 HP_NString 是个什么鬼,能不能贴出来....
        曼谷第一开膛手:来晚了,加油哦:+1:
        b93e8aa834f1:@随意_M 哦 谢谢!一直没找到,我再找找,要是方便的话 可以贴出来 3q~~
        随意_M:@jack_b2f3 一个第三方,你搜搜应该能找到
      • figure_ai:哈哈、谢谢分享、赞一个
        随意_M:@figure_ai 哈哈、谢谢捧场、回赞一个:stuck_out_tongue_closed_eyes:
      • 困惑困惑困惑:HP_NString这个类的方法没有显示出来啊
      • 492b9b7cf804:automaticallyAdjustsScrollViewInsets是在有ScrollView的时候会根据自动调整inset,调整者是ViewController,文档A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.会不会是因为是控制器的主视图来调整
        随意_M:@一个帅气网名 具体的原因我也不清楚,在这儿写出来也是希望知道原因的大神指点指点:relieved:
      • z我要是唐僧就留在女儿国:我们做法比较一致
        一看就是培训出来的
        哈哈哈
        随意_M:@z我要是唐僧就留在女儿国 :pensive:你太敏感,我又没批评你:yum:
        z我要是唐僧就留在女儿国:@随意_M 我也没说分啊 我也是培训出来的 不要这么敏感
        随意_M:@z我要是唐僧就留在女儿国 常言道出身不分贵贱
      • 无神: 这是几个项目的总结还是做一个项目的总结啊?写项目总结是个好习惯,把踩过的坑记录下来,以后就会少犯这样的错误了! :+1: 加油!
        随意_M:@无神 谢谢:blush:
        无神:@随意_M 这是好习惯,坚持!
        随意_M:@无神 一个:yum::yum::yum:很多零碎的小点记录一下,边做边记,有些还没来得及整理
      • minjing_lin:妹子写的,赞一下
        随意_M:@MinJing_Lin 谢谢:yum:
      • aaa000:你尽然是妹子……奇葩果!
        随意_M:@buttonTouch :cold_sweat:没有说你封建哈哈还好吧,兴趣是慢慢培养的:stuck_out_tongue_closed_eyes:
        aaa000:@随意Mimi 别这么说,我只是很好奇怎么会有妹子想到学这个的!这是工作工资相对其他行业来说是高一点,但不是发自内心得对计算机感兴趣,会觉得很枯燥乏味!每天对着电脑写东西 对人的辐射也很强,(据说是这样)!
        什么时代了 ,不要 那封建的 眼观看别人!
        随意_M:@buttonTouch :sweat:你性别歧视
      • 小小云喵:加油↖(^ω^)↗
        随意_M:@小小云喵 谢谢:yum:
      • 达若漠沙:赞一个~
        随意_M:@红天石 谢谢:yum:

      本文标题:01-iOS总结:项目中的各种小坑汇总

      本文链接:https://www.haomeiwen.com/subject/ytknyttx.html