iOS 開發(fā)常用宏(持續(xù)更新中...)

常用宏匯總

#pragma mark - NSLog宏定義
#ifdef RELEASE
    #define NSLog(...)
#else
    // 使用UTF8String的原因就是printf是C語言的流济,所以需要通過這個方法轉(zhuǎn)換一下才能打印
    #define FuncString [[NSString stringWithFormat:@"%s", __func__].lastPathComponent UTF8String]
    #define NSLog(...) printf("[HB]: %s 第%d行 日志信息如下:\n%s\n\n", FuncString, __LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
#endif

#pragma mark - 判斷對象是否為空
// 字符串是否為空
#define K_STRING_IS_EMPTY(str) (nil == str || [str isKindOfClass:[NSNull class]] || [str length] < 1)
// 數(shù)組是否為空
#define K_ARRAY_IS_EMPTY(array) (nil == array || [array isKindOfClass:[NSNull class]] || array.count == 0)
// 字典是否為空
#define K_DICT_IS_EMPTY(dict) (nil == dict || [dict isKindOfClass:[NSNull class]] || dict.allKeys.count == 0)
// 是否是空對象
#define K_OBJECT_IS_EMPTY(_object) (_object == nil \
|| [_object isKindOfClass:[NSNull class]] \
|| ([_object respondsToSelector:@selector(length)] && [(NSData *)_object length] == 0) \
|| ([_object respondsToSelector:@selector(count)] && [(NSArray *)_object count] == 0))

#pragma mark - 屏幕尺寸
// 獲取屏幕寬度與高度崖咨,確保在iOS8之后不受橫豎屏的影響
// nativeBounds是屏幕像素盾戴,不隨橫豎平改變的
#define K_SCREEN_WIDTH \
([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.width)
#define K_SCREEN_HEIGHT \
([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.height)
#define K_SCREEN_BOUNDS (CGRectMake(0, 0, K_SCREEN_WIDTH, K_SCREEN_HEIGHT))
#define K_SCREEN_SIZE   (CGSizeMake(K_SCREEN_WIDTH, K_SCREEN_HEIGHT))

#pragma mark - 一些縮寫
#define K_APPLICATION         [UIApplication sharedApplication]
#define K_KEY_WINDOW          [UIApplication sharedApplication].keyWindow
#define K_APP_DELEGATE        [UIApplication sharedApplication].delegate
#define K_USER_DEFAULTS       [NSUserDefaults standardUserDefaults]
#define K_NOTIFICATION_CENTER [NSNotificationCenter defaultCenter]

#pragma mark - App相關(guān)
// App版本號
#define K_APP_VERSION [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]
// App的唯一標(biāo)識
#define K_APP_BUNDLE_ID [[NSBundle mainBundle] bundleIdentifier]

#pragma mark - 真機(jī)相關(guān)
// 系統(tǒng)版本號
#define K_SYSTEM_VERSION [[UIDevice currentDevice] systemVersion]
// 獲取當(dāng)前語言
#define K_CURRENT_LANGUAGE ([[NSLocale preferredLanguages] objectAtIndex:0])
// 判斷是否為iPhone
#define K_IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
// 判斷是否為iPad
#define K_IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

#pragma mark - 沙盒路徑
// Document路徑
#define K_DOCUMENT_PATH [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
// temp路徑
#define K_TEMP_PATH NSTemporaryDirectory()
// Cache路徑
#define K_CACHE_PATH [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

#pragma mark - Color
#define K_RGB_COLOR(r, g, b) \
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define K_RGBA_COLOR(r, g, b, a) \
[UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]
// 使用方法:K_COLOR_WITH_HEX(0xFFFFFF)
#define K_COLOR_WITH_HEX(hexValue) \
[UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]
// 使用方法:K_COLOR_WITH_HEX_ALPHA(0xFFFFFF, 0.6)
#define K_COLOR_WITH_HEX_ALPHA(hexValue, a) \
[UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:a]

#pragma mark - 其他
// 弱引用
#define K_WEAK_SELF(type)   __weak typeof(type) weak##type = type;
// 強(qiáng)引用
#define K_STRONG_SELF(type) __strong typeof(type) type = weak##type;

// 由角度轉(zhuǎn)換弧度
#define K_DEGREES_TO_RADIAN(x)      (M_PI * (x) / 180.0)
// 由弧度轉(zhuǎn)換角度
#define K_RADIAN_TO_DEGREES(radian) (radian * 180.0) / (M_PI)

// 記錄時間間隔
#define K_START_TIME CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
#define K_END_TIME   NSLog(@"Time: %f", CFAbsoluteTimeGetCurrent() - start)

// iOS11適配,解決在沒有導(dǎo)航欄的情況下下拉刷新按鈕暴露在外部的問題
#define K_ADJUSTS_SCROLLVIEW_INSETS_NO(scrollView, vc)\
do {\
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"")\
if ([UIScrollView instancesRespondToSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:")]) {\
    [scrollView performSelector:NSSelectorFromString(@"setContentInsetAdjustmentBehavior:") withObject:@(2)];\
} else {\
    vc.automaticallyAdjustsScrollViewInsets = NO;\
}\
_Pragma("clang diagnostic pop")\
} while (0)

/** --------------------判斷是真機(jī)還是模擬器络断,可以用這段代碼來判斷真機(jī)或模擬器來執(zhí)行不同邏輯-------------------- */
#if TARGET_OS_IPHONE
// 真機(jī)
#endif

#if TARGET_IPHONE_SIMULATOR
// 模擬器
#endif
/** --------------------判斷是真機(jī)還是模擬器,可以用這段代碼來判斷真機(jī)或模擬器來執(zhí)行不同邏輯-------------------- */

解決iOS8后bounds橫豎屏的影響

  • 先來看一個輸出結(jié)果
在***iOS7***中輸出:
Landscape: NO
UIScreen.mainScreen().bounds: (0.0, 0.0, 320.0, 568.0)

Landscape: YES
UIScreen.mainScreen().bounds: (0.0, 0.0, 320.0, 568.0)
-------------------------------------------------------------------------
在***iOS8***中輸出:
Landscape: NO
UIScreen.mainScreen().bounds: (0.0, 0.0, 320.0, 568.0)

Landscape: YES
UIScreen.mainScreen().bounds: (0.0, 0.0, 568.0, 320.0)
  • 方案1(推薦
    • 在iOS8中增加了2個屬性项玛,通過這兩個屬性可以解決iOS8后的問題
      • nativeBounds:屏幕像素貌笨,不隨橫豎平改變的
      • nativeScale:1(non retina) / 2(retina) / 3(retina hd)
  • 方案2
+ (CGSize)screenSize {  
    CGSize screenSize = [UIScreen mainScreen].bounds.size;  
    return CGSizeMake(MIN(screenSize.width, screenSize.height), MAX(screenSize.width, screenSize.height));  
} 

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市襟沮,隨后出現(xiàn)的幾起案子躁绸,更是在濱河造成了極大的恐慌,老刑警劉巖臣嚣,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净刮,死亡現(xiàn)場離奇詭異,居然都是意外死亡硅则,警方通過查閱死者的電腦和手機(jī)淹父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎虫,“玉大人暑认,你說我怎么就攤上這事〈笊螅” “怎么了蘸际?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長徒扶。 經(jīng)常有香客問我粮彤,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任导坟,我火速辦了婚禮屿良,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惫周。我一直安慰自己尘惧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布递递。 她就那樣靜靜地躺著喷橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪登舞。 梳的紋絲不亂的頭發(fā)上重慢,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音逊躁,去河邊找鬼似踱。 笑死,一個胖子當(dāng)著我的面吹牛稽煤,可吹牛的內(nèi)容都是我干的核芽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼酵熙,長吁一口氣:“原來是場噩夢啊……” “哼轧简!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匾二,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤哮独,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后察藐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮璧,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年分飞,在試婚紗的時候發(fā)現(xiàn)自己被綠了悴务。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡譬猫,死狀恐怖讯檐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情染服,我是刑警寧澤别洪,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站柳刮,受9級特大地震影響挖垛,放射性物質(zhì)發(fā)生泄漏痒钝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一晕换、第九天 我趴在偏房一處隱蔽的房頂上張望午乓。 院中可真熱鬧站宗,春花似錦闸准、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敏释,卻和暖如春库快,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钥顽。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工义屏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜂大。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓闽铐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奶浦。 傳聞我的和親對象是個殘疾皇子兄墅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容