自己借鑒或整理的一些常用宏锦积,如果對(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 */