iOS 常用宏

自己借鑒或整理的一些常用宏锦积,如果對(duì)大家有幫助,希望給個(gè)喜歡,如果有發(fā)現(xiàn)錯(cuò)誤請(qǐng)指正。



#ifndef Macros_h
#define Macros_h





#pragma mark -
#pragma mark Empty object

static inline BOOL IsEmptyObject(id object) {
    return object == nil
        || [object isEqual:[NSNull null]]
        || ([object respondsToSelector:@selector(length)] && ([(NSData *)object length] == 0 || [(NSString *)object length] == 0))
        || ([object respondsToSelector:@selector(count)] && ([(NSArray *)object count] == 0 || [(NSDictionary *)object count] == 0));
}

static inline BOOL IsValidObject(id object) {
    return !IsEmptyObject(object);
}

static inline NSString *StringFromObject(id object) {
    if (object == nil || [object isEqual:[NSNull null]]) {
        return @"";
    } else if ([object isKindOfClass:[NSString class]]) {
        return object;
    } else if ([object respondsToSelector:@selector(stringValue)]){
        return [object stringValue];
    } else {
        return [object description];
    }
}

static inline void dispatch_async_in_main_queue(void (^block)()) {
    if (pthread_main_np()) {
        block();
    } else {
        dispatch_async(dispatch_get_main_queue(), block);
    }
}



#pragma mark -
#pragma mark iOS Version

#define IOS_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define IOS_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:[NSString stringWithFormat:@"%f",v] options:NSNumericSearch] != NSOrderedAscending)
#define IOS_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define IOS_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

#define IOS_8   IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(8)
#define IOS_9   IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(9)
#define IOS_10  IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(10)
#define IOS_11  IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(11)



#pragma mark -
#pragma mark UIColor

#define COLOR_HEXA(hexValue,a)         [UIColor colorWithRed:((hexValue & 0xFF0000) >> 16) / 255.0 \
                                                       green:((hexValue & 0xFF00) >> 8) / 255.0    \
                                                        blue:(hexValue & 0xFF) / 255.0             \
                                                       alpha:a]
#define COLOR_HEX(hexValue)            COLOR_HEXA(hexValue,1.0)
#define COLOR_RGBA(r,g,b,a)            [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
#define COLOR_RGB(r,g,b)               COLOR_RGBA(r,g,b,1.0)



#pragma mark -
#pragma mark Frame Geometry

#define WIDTH(view) view.frame.size.width
#define HEIGHT(view) view.frame.size.height
#define X(view) view.frame.origin.x
#define Y(view) view.frame.origin.y
#define LEFT(view) view.frame.origin.x
#define TOP(view) view.frame.origin.y
#define BOTTOM(view) (view.frame.origin.y + view.frame.size.height) 
#define RIGHT(view) (view.frame.origin.x + view.frame.size.width) 



#pragma mark -
#pragma mark IndexPath

#define INDEX_PATH(a,b) [NSIndexPath indexPathWithIndexes:(NSUInteger[]){a,b} length:2]



#pragma mark -
#pragma mark weakSelf strongSelf

#define WEAKSELF __weak typeof(self) weakSelf = self;
#define STRONGSELF __strong __typeof(weakSelf) strongSelf = weakSelf;



#pragma mark -
#pragma mark Device type. 
// Corresponds to "Targeted device family" in project settings
// Universal apps will return true for whichever device they're on. 
// iPhone apps will return true for iPhone even if run on iPad.

#define TARGETED_DEVICE_IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
#define TARGETED_DEVICE_IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
#define TARGETED_DEVICE_IS_IPHONE_568 TARGETED_DEVICE_IS_IPHONE && ScreenHeight == 568



#pragma mark -
#pragma mark Transforms(角度轉(zhuǎn)弧度)

#define DEGREES_TO_RADIANS(degrees) degrees * M_PI / 180



#pragma mark -
#pragma mark - 單例宏

#define SINGLETON_INTERFACE(className) + (instancetype)shared##className;

#define SINGLETON_IMPLEMENTATION(className) \
static id instance; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone { \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        instance = [super allocWithZone:zone]; \
    }); \
    return instance; \
} \
 \
+ (instancetype)shared##className { \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        instance = [[self alloc] init]; \
    }); \
    return instance; \
} \
 \
- (id)copyWithZone:(NSZone *)zone { \
    return instance; \
}



#pragma mark -
#pragma mark - 提示框(UIAlertController)

#define ZDALERT(TITLE, MESSAGE, BUTTONTITLE) \
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:TITLE message:MESSAGE preferredStyle:UIAlertControllerStyleAlert]; \
[alertController addAction:[UIAlertAction actionWithTitle:BUTTONTITLE style:UIAlertActionStyleDefault handler:nil]]; \
[self presentViewController:alertController animated:YES completion:nil];



#pragma mark -
#pragma mark - Size

/** 屏幕尺寸 */
#define SCREEN_BOUNDS ([UIScreen mainScreen].bounds)

/** 屏幕寬度 */
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

/** 屏幕高度 */
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)

/** 判斷iPhoneX */
#define IS_iPhoneX (SCREEN_WIDTH == 375 && SCREEN_HEIGHT == 812)

/** 狀態(tài)欄高度 */
#define STATUS_BAR_HEIGHT (IS_iPhoneX ? 44 : 20)

/** 導(dǎo)航欄高度 */
#define NAVIGATION_BAR_HEIGHT 44

/** 狀態(tài)欄+導(dǎo)航欄 高度 */
#define STATUS_AND_NAVIGATION_HEIGHT (STATUS_BAR_HEIGHT + NAVIGATION_BAR_HEIGHT)

/** 標(biāo)簽欄底部空白高度(iPhoneX下為34)*/
#define TABBAR_SAFEAREA_HEIGHT (IS_iPhoneX ? 34 : 0)

/** 標(biāo)簽欄高度 */
#define TABBAR_HEIGHT 49

/** 工具欄高度 */
#define TOOLBAR_HEIGHT 49

/** 一般表視圖內(nèi)容高度 */
#define CONTENT_HEIGHT (SCREEN_HEIGHT - NAVIGATION_BAR_HEIGHT - STATUS_BAR_HEIGHT - TABBAR_SAFEAREA_HEIGHT)



/** 黃金比例值 0.382+0.618=1   0.382/0.618=0.618   0.618/1=0.618 */
#define GOLD_SCALE_LONG(x)  (x * 0.618)
#define GOLD_SCALE_SHORT(x) (x * 0.382)

/** 單條分隔線高度玛歌,2x屏為1/2,3x屏為1/3 */
#define SINGLE_LINE_HEIGHT (1 / [UIScreen mainScreen].scale)
// 在非高清屏上擎椰,一個(gè)Point對(duì)應(yīng)一個(gè)像素沾鳄。為了防止“antialiasing”導(dǎo)致的奇數(shù)像素的線渲染時(shí)出現(xiàn)失真,你需要設(shè)置偏移0.5Point确憨。在高清屏幕上译荞,要繪制一個(gè)像素的線,需要設(shè)置線寬為0.5個(gè)Point休弃,同時(shí)設(shè)置偏移為0.25 Point吞歼。此宏用在設(shè)置frame時(shí)在x或y軸偏移
#define SINGLE_LINE_ADJUST_OFFSET ((1 / [UIScreen mainScreen].scale) / 2)



#pragma mark -
#pragma mark Scale size (base iPhone6s plus iPad寬取plus寬)

#define SCALE(x) x * (SCREEN_WIDTH > 414 ? 414 : SCREEN_WIDTH) / 414



#pragma mark -
#pragma mark - NSLog

#ifdef DEBUG
#define NSLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define NSLog(fmt, ...)
#endif

//使用ARC和不使用ARC
#if __has_feature(objc_arc)
//compiling with ARC
#else
// compiling without ARC
#endif



#pragma mark -
#pragma mark - AppDelegate
#define ZDAppDelegate (AppDelegate *)[UIApplication sharedApplication].delegate
#define ZDKeyWindow [UIApplication sharedApplication].keyWindow



#pragma mark -
#pragma mark - TICK、TOCK(代碼耗時(shí)調(diào)試)塔猾,也可以用YYBenchmark
#define TICK NSDate *startTime = [NSDate date];
#define TOCK NSLog(@"tick和tock之間耗時(shí):%lf", - startTime.timeIntervalSinceNow);




#endif /* Macros_h */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篙骡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子丈甸,更是在濱河造成了極大的恐慌糯俗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦擂,死亡現(xiàn)場(chǎng)離奇詭異得湘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顿仇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門淘正,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臼闻,你說我怎么就攤上這事鸿吆。” “怎么了述呐?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惩淳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我乓搬,道長(zhǎng)思犁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任缤谎,我火速辦了婚禮抒倚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坷澡。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布频敛。 她就那樣靜靜地躺著项郊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斟赚。 梳的紋絲不亂的頭發(fā)上着降,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音拗军,去河邊找鬼任洞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛发侵,可吹牛的內(nèi)容都是我干的交掏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刃鳄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼盅弛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起叔锐,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤挪鹏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后愉烙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讨盒,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年步责,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了催植。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勺择,死狀恐怖创南,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情省核,我是刑警寧澤稿辙,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站气忠,受9級(jí)特大地震影響邻储,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旧噪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一吨娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淘钟,春花似錦宦赠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毡琉。三九已至,卻和暖如春妙色,著一層夾襖步出監(jiān)牢的瞬間桅滋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工身辨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丐谋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓煌珊,卻偏偏與公主長(zhǎng)得像号俐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怪瓶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356