iOS 常用宏

自己借鉴或整理的一些常用宏,如果对大家有帮助,希望给个喜欢,如果有发现错误请指正。



#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(角度转弧度)

#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)

/** 状态栏高度 */
#define STATUS_BAR_HEIGHT (IS_iPhoneX ? 44 : 20)

/** 导航栏高度 */
#define NAVIGATION_BAR_HEIGHT 44

/** 状态栏+导航栏 高度 */
#define STATUS_AND_NAVIGATION_HEIGHT (STATUS_BAR_HEIGHT + NAVIGATION_BAR_HEIGHT)

/** 标签栏底部空白高度(iPhoneX下为34)*/
#define TABBAR_SAFEAREA_HEIGHT (IS_iPhoneX ? 34 : 0)

/** 标签栏高度 */
#define TABBAR_HEIGHT 49

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

/** 一般表视图内容高度 */
#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)
// 在非高清屏上,一个Point对应一个像素。为了防止“antialiasing”导致的奇数像素的线渲染时出现失真,你需要设置偏移0.5Point。在高清屏幕上,要绘制一个像素的线,需要设置线宽为0.5个Point,同时设置偏移为0.25 Point。此宏用在设置frame时在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(代码耗时调试),也可以用YYBenchmark
#define TICK NSDate *startTime = [NSDate date];
#define TOCK NSLog(@"tick和tock之间耗时:%lf", - startTime.timeIntervalSinceNow);




#endif /* Macros_h */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335