iOS總結:項目中的各種小坑彙總

来源:http://www.cnblogs.com/tylerzhang/archive/2016/10/19/5978067.html
-Advertisement-
Play Games

一、字元串轉JSON 在網路請求時,如果服務端返回的是字元串,那麼就需要我們自己封裝一個類,將請求下來的字元串轉換成json對象,從而存入模型中。 註意: 字元串中如果含有一些特殊轉意符(如\n、\t等),需要先對字元串進行處理。 示例代碼如下: 二、圖片拉伸 三、Label文字自適應frame 方 ...


一、字元串轉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(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

方式一

推薦此方式,此方式能夠獲取高度,實現自動換行、行距設置

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

 

方式二

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

 

四、時間間隔一天

項目中的需求:控制彈窗彈出次數,要求每天彈出一次即可,寫一個類,方便調用

+(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空白給頂部狀態欄,但是這空白不好看呀,所以我們在對應的控制器里viewDidLoad方法裡加上self.automaticallyAdjustsScrollViewInsets = NO,而[[UIApplication sharedApplication]setStatusBarHidden:YES
withAnimation:UIStatusBarAnimationFade];是將整個狀態欄給隱藏掉了,用戶體驗效果不好,這裡並不提倡。在我處理狀態欄的時候發現automaticallyAdjustsScrollViewInsets的方法不起作用,經過上網查詢,最終解決了,原來控制器里我將scrollView作為了第一視圖, 只要scrollView的第一視圖身份取消,automaticallyAdjustsScrollViewInsets方法就奏效了。

OK,今天先總結這幾點,錯誤的地方,希望大神多多指點!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這個視圖對應的控制器是 這樣的話,這個date變數,是不會發生改變的,沒有觸發臟檢查,所以這時候要$apply方法,所有自定義的方法都要用$apply來觸發臟檢查 這樣那個日期就會變化了 $digest方法是觸動臟檢查的方法,為什麼不直接用這個呢,因為$apply會在執行時,運行一個eval語句,如 ...
  • 經常在別人的博客上有看到他們使用一些動態圖片來展示自己的項目運行效果。那麼,關於屏幕錄製與生成 Gif 圖要如何操作呢? 之前想著是不是用**等手機軟體錄製手機屏幕,然後利用**等播放器截取視頻 gif 圖。不過這些屏幕錄製的一般都帶水印。後面有找到方法,說 Android Studio 工具可以對 ...
  • 1.添加不同類型條目 2.常駐懸浮框使用 3.activity_app_manager.xml ...
  • AToolActivity.java SmsBackUp.java 1 package com.itheima.mobilesafe74.engine; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java ...
  • 新接觸一門程式或者開發框架,我一般都要先弄清楚程式的入口在哪裡,程式怎麼運行的;建立一個項目後,各個文件夾有什麼作用以及如何使用等等。理清楚這些東西對以後開發是很有好處的,古話說得好,工欲善其事,必先利其器。本文主要總結android程式的入口點和程式的運行流程(初識),android項目中各文件夾 ...
  • ReactiveX是Reactive Extensions的縮寫,一般簡寫為Rx,最初是LINQ的一個擴展,由微軟的架構師Erik Meijer領導的團隊開發,在2012年11月開源,Rx是一個編程模型,目標是提供一致的編程介面,幫助開發者更方便的處理非同步數據流,Rx庫支持.NET、JavaScri ...
  • 前言 Swift已推出數年,與Objective-C相比Swift的語言機制及使用簡易程度上更接地氣,大大降低了iOS入門門檻。當然這對新入行的童鞋沒來講,的確算是福音,但對於整個iOS編程從業者來講,真真是,曾幾何時“高大上”,轉瞬之間“矮矬窮”。再加上培訓班橫行,批量批發之下,iOS再也看不到當 ...
  • 移動應用在處理網路資源時,一般都會做離線緩存處理,其中以圖片緩存最為典型,其中很流行的離線緩存框架為SDWebImage。 但是,離線緩存會占用手機存儲空間,所以緩存清理功能基本成為資訊、購物、閱讀類app的標配功能。 今天介紹的離線緩存功能的實現,主要分為緩存文件大小的獲取、清除緩存文件的實現。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...