App開發流程之字元串處理工具類

来源:http://www.cnblogs.com/ALongWay/archive/2016/09/12/5864867.html
-Advertisement-
Play Games

記錄字元串的處理,不是一個簡單的工作。 NSString是代碼中隨處可見的類型,也是應用和處理繁多的對象,在此只記錄需要常備的方法,並且加以說明。 說明: 1.計算字元串尺寸的方法,sizeWithFont系列方法已經被廢物,建議改為boundingRectWithSize方法;NSAttribut ...


記錄字元串的處理,不是一個簡單的工作。

NSString是代碼中隨處可見的類型,也是應用和處理繁多的對象,在此只記錄需要常備的方法,並且加以說明。

#pragma mark -- 【計算字元串尺寸
+ (CGSize)getStringSizeWith:(NSString *)string attributes:(NSDictionary *)attributes;

+ (CGSize)getStringSizeWith:(NSString *)string attributes:(NSDictionary *)attributes maxWidth:(CGFloat)maxWidth;

+ (CGSize)getStringSizeWith:(NSString *)string attributes:(NSDictionary *)attributes maxHeight:(CGFloat)maxHeight;

+ (CGSize)getStringSizeWith:(NSString *)string font:(UIFont *)font paragraphStyle:(NSParagraphStyle *)paragraphStyle maxWidth:(CGFloat)maxWidth;

+ (CGSize)getStringSizeWith:(NSString *)string font:(UIFont *)font lineHeight:(CGFloat)lineHeight maxWidth:(CGFloat)maxWidth;

+ (CGSize)getStringSizeWith:(NSString *)string font:(UIFont *)font;

+ (CGSize)getStringSizeWith:(NSString *)string font:(UIFont *)font maxWidth:(CGFloat)maxWidth;

+ (CGSize)getStringSizeWith:(NSString *)string font:(UIFont *)font maxHeight:(CGFloat)maxHeight;
#pragma mark -- 】計算字元串尺寸

#pragma mark -- 【生成屬性字元串
+ (NSAttributedString *)getAttributedStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color lineHeight:(CGFloat)lineHeight maxWidth:(CGFloat)maxWidth;

+ (NSAttributedString *)getAttributedStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color paragraphStyle:(NSParagraphStyle *)paragraphStyle maxWidth:(CGFloat)maxWidth;
#pragma mark -- 】生成屬性字元串

#pragma mark -- 【處理時間字元串
+ (NSString *)getCurrentDateString;

+ (NSString *)getCurrentDateStringWithFormat:(NSString *)dateFormat;

+ (NSString *)getDateStringWithTimeInterval:(NSTimeInterval)timeInterval;

+ (NSString *)getDateStringWithTimeInterval:(NSTimeInterval)timeInterval dateFormat:(NSString *)dateFormat;

+ (NSTimeInterval)getTimeIntervalWithDateString:(NSString *)dateString;

+ (NSDateComponents *)getDateComponentsWithDateString:(NSString *)dateString;

+ (NSDateComponents *)getDateComponentsWithTimeInterval:(NSTimeInterval)timeInterval;

+ (NSString *)getContentPublishedTimeStringWithDateString:(NSString *)dateString;
#pragma mark -- 】處理時間字元串

#pragma mark -- 【處理網路請求相關字元串
+ (NSString *)getSafeDecodeStringFromJsonValue:(NSString *)jsonValue;

/**
 *  被解析的url字元串格式為:xxxxxx?a=xxx&b=xxx
 *
 *  @param urlString urlString description
 *
 *  @return return value description
 */
+ (NSDictionary *)getParametersDictionaryWithUrlString:(NSString *)urlString;

/**
 *  被解析的url字元串格式為:xxxxxx/realname_320x640.png(/jpg)
 *
 *  @param urlString urlString description
 *
 *  @return return value description
 */
+ (CGSize)getImageOriginalSizeWithUrlString:(NSString *)urlString;

+ (CGSize)getImageShowSizeWithUrlString:(NSString *)urlString maxWidth:(NSInteger)maxWidth;

/**
 *  被解析的url字元串格式為:xxxxxx/realname_320x640.png(/jpg)
 *
 *  @param originalUrlString originalUrlString description
 *  @param newWidth          newWidth description
 *
 *  @return 在原urlString後增加類似"?act=resize&x=320",用於伺服器裁剪尺寸
 */
+ (NSString *)getImageResizedUrlStringWithOriginalUrlString:(NSString *)originalUrlString newWidth:(NSInteger)newWidth;
#pragma mark -- 】處理網路請求相關字元串

#pragma mark -- 其他功能方法
/**
 *  獲取字元串的位元組長度(一個漢字占兩個位元組長度)
 *
 *  @param string string description
 *
 *  @return return value description
 */
+ (NSInteger)getBytesLengthWithString:(NSString *)string;

/**
 *  驗證手機號是否合理
 *
 *  @param phoneNum phoneNum description
 *
 *  @return return value description
 */
+ (BOOL)isValidatedMobliePhoneNum:(NSString *)phoneNum;

+ (void)printAllCurrentSupportedFonts;

+ (NSString *)getDeviceVersion;

+ (NSString *)getAppShortVersion;

+ (NSString *)getAppBundleVersion;

 

說明:

1.計算字元串尺寸的方法,sizeWithFont系列方法已經被廢物,建議改為boundingRectWithSize方法;NSAttributedString也有boundingRectWithSize方法,如果已知屬性字元串可以直接使用。請查看UIKit/NSStringDrawing.h中NSString和NSAttributedString的擴展方法

 

+ (CGSize)getStringSizeWith:(NSString *)string attributes:(NSDictionary *)attributes
{
    CGSize size = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
    
    return size;
}

 

3.生成屬性字元串的方法中,NSMutableParagraphStyle的對象用於設置段落屬性(行高、行間距、段落間距、對齊、書寫方向、首行縮進、行首縮進、行尾縮進),請查看UIKit/NSParagraphStyle.h

+ (NSAttributedString *)getAttributedStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color lineHeight:(CGFloat)lineHeight maxWidth:(CGFloat)maxWidth
{
    CGFloat perLineHeight = [StringHelper getStringSizeWith:@"內容" font:font].height;
    CGFloat lineSpacing = (lineHeight - perLineHeight)/2.5;//2.5是在實際應用中,調校的值
    perLineHeight = lineHeight - lineSpacing;
    
    //設置文欄位落
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = perLineHeight;
    paragraphStyle.maximumLineHeight = perLineHeight;
    paragraphStyle.minimumLineHeight = perLineHeight;
    paragraphStyle.lineBreakMode = commonLineBreakMode;
    paragraphStyle.lineSpacing = lineSpacing;//行間距
    paragraphStyle.paragraphSpacing = 0;//段間距
    paragraphStyle.alignment = commonTextAlignment;

    return [self getAttributedStringWithString:string font:font color:color paragraphStyle:paragraphStyle maxWidth:maxWidth];
}

+ (NSAttributedString *)getAttributedStringWithString:(NSString *)string font:(UIFont *)font color:(UIColor *)color paragraphStyle:(NSParagraphStyle *)paragraphStyle maxWidth:(CGFloat)maxWidth
{
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [dic setObject:font forKey:NSFontAttributeName];
    [dic setObject:color forKey:NSForegroundColorAttributeName];
    [dic setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
    
    NSAttributedString* attributedString;
    
    if (string == nil) {
        attributedString = [[NSAttributedString alloc] initWithString:@" " attributes:dic];
    }else{
        attributedString = [[NSAttributedString alloc] initWithString:string attributes:dic];
    }
    
    return attributedString;
}

 

4.NSFontAttributeName、NSForegroundColorAttributeName、NSParagraphStyleAttributeName為NSAttributedString常用屬性鍵值,更多查看UIKit/NSAttributedString.h

5.轉換時間字元串,需要記錄一下常用時間格式占位字元:

#pragma mark -- 時間格式占位符
//G:        公元時代,例如AD公元
//yy:       年的後2位
//yyyy:     完整年
//MM:       月,顯示為1-12,帶前置0
//MMM:      月,顯示為英文月份簡寫,如 Jan
//MMMM:     月,顯示為英文月份全稱,如 Janualy
//dd:       日,2位數表示,如02
//d:        日,1-2位顯示,如2,無前置0
//EEE:      簡寫星期幾,如Sun
//EEEE:     全寫星期幾,如Sunday
//aa:       上下午,AM/PM
//H:        時,24小時制,0-23
//HH:       時,24小時制,帶前置0
//h:        時,12小時制,無前置0
//hh:       時,12小時制,帶前置0
//m:        分,1-2位
//mm:       分,2位,帶前置0
//s:        秒,1-2位
//ss:       秒,2位,帶前置0
//S:        毫秒
//Z:        GMT(時區)
+ (NSString *)getCurrentDateString
{
    return [self getCurrentDateStringWithFormat:@"yyyy-MM-dd HH:mm:ss"];
}

+ (NSString *)getCurrentDateStringWithFormat:(NSString *)dateFormat
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:dateFormat];
    NSDate *currentDate = [NSDate date];
    NSString *currentDateString = [dateFormatter stringFromDate:currentDate];
    
    return currentDateString;
}

 

6.getDateComponentsWithDateString方法用於得到日期組成對象,實現代碼、測試代碼、輸入log如下:

+ (NSDateComponents *)getDateComponentsWithDateString:(NSString *)dateString
{
    NSTimeInterval timeInterval = [self getTimeIntervalWithDateString:dateString];
    
    return [self getDateComponentsWithTimeInterval:timeInterval];
}

+ (NSDateComponents *)getDateComponentsWithTimeInterval:(NSTimeInterval)timeInterval
{
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSCalendarUnit unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitWeekOfMonth  | NSCalendarUnitWeekOfYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *components = [calendar components:unitFlags fromDate:date];
    
    return components;
}
    NSDateComponents *components = [StringHelper getDateComponentsWithDateString:@"2016-09-12 12:56:10"];
    LOG(@"%@", components);
    
    components = [StringHelper getDateComponentsWithDateString:@"2016-09-11 12:56:10"];
    LOG(@"%@", components);

    components = [StringHelper getDateComponentsWithDateString:@"2016-09-10 12:56:10"];
    LOG(@"%@", components);
2016-09-12 13:02:12.283 base[14229:1700476] <NSDateComponents: 0x7fb0f9570770>
    Calendar Year: 2016
    Month: 9
    Leap month: no
    Day: 12
    Hour: 12
    Minute: 56
    Second: 10
    Week of Year: 38
    Week of Month: 3
    Weekday: 2
2016-09-12 13:02:15.600 base[14229:1700476] <NSDateComponents: 0x7fb0f961e760>
    Calendar Year: 2016
    Month: 9
    Leap month: no
    Day: 11
    Hour: 12
    Minute: 56
    Second: 10
    Week of Year: 38
    Week of Month: 3
    Weekday: 1
2016-09-12 13:02:15.601 base[14229:1700476] <NSDateComponents: 0x7fb0f94b6620>
    Calendar Year: 2016
    Month: 9
    Leap month: no
    Day: 10
    Hour: 12
    Minute: 56
    Second: 10
    Week of Year: 37
    Week of Month: 2
    Weekday: 7

需要註意的是,Weekday“一”為“周日”,“七”為“周六”,詳情可以查看《聖經 創世紀》;Week of Month表示本月第幾周;Week of Year表示今年第幾周。

7.getDeviceVersion方法更新了iPhone 7和iPhone 7 Plus的設備版本判斷,詳情參考:https://www.theiphonewiki.com/wiki/Models

8.隨便一提,如果在新增的NSObject類中,無法使用CGFloat、CGPoint之類的類型,是因為沒有引用這些類型所在的頭文件,在預編譯頭文件中引用即可:#import <UIKit/UIKit.h>

 

base項目已更新:[email protected]:ALongWay/base.git


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

-Advertisement-
Play Games
更多相關文章
  • 基本用法 先看一下最簡單的一個實現,代碼如下: 我們可以通過如下的方式來調用: 大家可能看到了,每次用的時候都要new一下,也就是說每個實例在記憶體里都是一份copy,如果你不需要傳參數或者沒有一些特殊苛刻的要求的話,我們可以在最後一個}後面加上一個括弧,來達到自執行的目的,這樣該實例在記憶體中只會存在 ...
  • API-https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079 一、同步、非同步和 ...
  • 有時應用程式需要能夠進行自定義繪圖。我們可以依靠兩個不同的庫來滿足我們的繪圖需要。一個庫是Quartz 2D,它是Core Graphics框架的一部分;另一個庫是OpenGL ES,它是跨平臺的圖形庫。OpenGL ES是跨平臺圖形庫OpenGL的簡化版。OpenGL ES是OpenGL的一個子集 ...
  • Android 樣式 android中的樣式和CSS樣式作用相似,都是用於為界面元素定義顯示風格,它是一個包含一個或者多個view控制項屬性的集合。如:需要定義字體的顏色和大小。 在CSS中是這樣定義的: 可以像這樣使用上面的css樣式:<div class="wu">wuyudong‘blog</d ...
  • http://blog.sina.com.cn/s/blog_45e2b66c01019wfg.html UIScrollView 快速滑動過程中,滾動速度過快,可以通過屬性decelerationRate控制。 decelerationRate範圍為0 1,一般0 0.5沒有多少區別。0也沒有問題 ...
  • 中文 iOS/Mac 開發博客列表 ...
  • 前言: 項目是基於平板開發的,設計的界面是要求橫屏展示界面。所以我將所有的Activity都強制設置為橫屏 問題: 主界面,最常見的Activity+n個Fragment 我這裡使用的hide、show Fragment的方式來切換Fragment,當關閉手機、平板屏幕再打開,會發現Fragment ...
  • 1 #import "Cat.h" 2 3 @interface Cat () 4 5 @property (nonatomic, copy) NSString *name; 6 7 @end 8 9 @implementation Cat{ 10 int age; 11 } 12 13 -(ins ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...