iOS 常用的宏定义
//颜色--
#define RGB(r, g, b) [UIColor colorWithRed:(r)/255.0fgreen:(g)/255.0fblue:(b)/255.0falpha:1]
#define RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0fgreen:(g)/255.0fblue:(b)/255.0falpha:(a)]
// 颜色(16进制)
#define HexColor(hexValue) [UIColor colorWithRed:((float)((hexValue &0xFF0000) >>16)) /255.0green:((float)((hexValue &0xFF00) >>8)) /255.0blue:((float)(hexValue &0xFF)) /255.0alpha:1.0f]
#define HexAlphaColor(hexValue, alpha) [UIColor colorWithRed:((float)((hexValue &0xFF0000) >>16)) /255.0green:((float)((hexValue &0xFF00) >>8)) /255.0blue:((float)(hexValue &0xFF)) /255.0alpha:alpha]
// 随机颜色
#define RandomColor [UIColor colorWithRed:arc4random_uniform(256) /255.0green:arc4random_uniform(256) /255.0blue:arc4random_uniform(256) /255.0alpha:1]
//文件夹/文件路径
//获取沙盒 temp
#define PathTemp NSTemporaryDirectory()
//获取沙盒 Document
#define PathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
//获取沙盒 Cache
#define PathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
//Document路径下文件/文件夹
#define DocumentPath(res) [PathDocument stringByAppendingPathComponent:res]
//Cache路径下文件/文件夹
#define CachePath(res) [PathCache stringByAppendingPathComponent:res]
//Temp路径下文件/文件夹
#define TempPath(res) [PathTemp stringByAppendingPathComponent:res]
//frame设置
//是否是手机
#define IS_iPhone ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
//是否是iPad
#define IS_iPad ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
//屏幕宽
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
//屏幕高
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
//屏幕frame
#define SCREEN_FRAME [UIScreen mainScreen].bounds
// 判断iPhone4系列
#define IS_iPhone4 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,960), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPhone5系列
#define IS_iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPhone6系列
#define IS_iPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750,1334), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iphone6Plus系列
#define IS_iPhone6Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242,2208), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPhoneX
#define IS_IPHONE_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125,2436), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPHoneXr
#define IS_IPHONE_Xr ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828,1792), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPhoneXs
#define IS_IPHONE_Xs ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125,2436), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
// 判断iPhoneXs Max
#define IS_IPHONE_Xs_Max ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242,2688), [[UIScreen mainScreen] currentMode].size) && !IS_iPad : NO)
//6为标准适配的,如果需要其他标准可以修改
#define Scale_W(w) (SCREEN_WIDTH/375) * (w)
#define Scale_H(h) (SCREEN_HEIGHT/667) * (h)
//statusbar的高度
#define STATUS_HEIGHT ((IS_IPHONE_X || IS_IPHONE_Xr || IS_IPHONE_Xs || IS_IPHONE_Xs_Max) == NO ?20.0:44.0)
//navigation高度 (带statusbar)
#define NAVGATION_HEIGHT ((IS_IPHONE_X || IS_IPHONE_Xr || IS_IPHONE_Xs || IS_IPHONE_Xs_Max) == NO ?64.0:88.0)
//底部安全高度
#define BOTTOM_HEIGHT ((IS_IPHONE_X || IS_IPHONE_Xr || IS_IPHONE_Xs || IS_IPHONE_Xs_Max) == NO ?0.0:34.0)
// View 坐标(x,y)和宽高(width,height)
#define X(v) (v).frame.origin.x
#define Y(v) (v).frame.origin.y
#define WIDTH(v) (v).frame.size.width
#define HEIGHT(v) (v).frame.size.height
#define MinX(v) CGRectGetMinX((v).frame)
#define MinY(v) CGRectGetMinY((v).frame)
#define MidX(v) CGRectGetMidX((v).frame)
#define MidY(v) CGRectGetMidY((v).frame)
#define MaxX(v) CGRectGetMaxX((v).frame)
#define MaxY(v) CGRectGetMaxY((v).frame)
//常用定义
//加载图片
#define GetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]]
//字体
#define FONT_SIZE(f) [UIFont systemFontOfSize:(f)]//不加粗
#define FONT_B_SIZE(f) [UIFont boldSystemFontOfSize:(f)]//加粗
#define NameFont(x) [UIFont fontWithName:@"PingFangSC-Light"size:x]//苹方细体
#define NameBFont(x) [UIFont fontWithName:@"PingFangSC-Regular"size:x]//苹方体
#define NumFont(x) [UIFont fontWithName:@"Helvetica Neue"size:x]//数字字体
#define Customize(name,x) [UIFont fontWithName:name size:x]//自定义字体
//弱引用self(用于block块中)
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self;
// alert
#define Alert(_S_, ...) [[[UIAlertView alloc] initWithTitle:@"提示"message:[NSString stringWithFormat:(_S_), ##__VA_ARGS__] delegate:nil cancelButtonTitle:@"知道了"otherButtonTitles:nil] show]
#pragma mark- View设置
// View 圆角和加边框
#define ViewBorderRadius(view, Radius, Width, Color)\
\
[view.layer setCornerRadius:(Radius)];\
[view.layer setMasksToBounds:YES];\
[view.layer setBorderWidth:(Width)];\
[view.layer setBorderColor:[Color CGColor]]
// View 圆角
#define ViewRadius(view, Radius)\
\
[view.layer setCornerRadius:(Radius)];\
[view.layer setMasksToBounds:YES]
// View 阴影
#define ViewShadow(view,color,size,alpha,radius)\
\
view.layer.shadowColor = color.CGColor;\
view.layer.shadowOffset = size;\
view.layer.shadowOpacity = alpha;\
view.layer.shadowRadius = radius
// View 边框
#define ViewBorder(view, Color, Width)\
\
[view.layer setBorderWidth:(Width)];\
[view.layer setBorderColor:(Color).CGColor]
#pragma mark- 系统信息
// 当前语言
#define CURRENTLANGUAGE ([[NSLocale preferredLanguages] objectAtIndex:0])
// app版本号
#define VERSION (NSString *)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
// app Build版本号
#define BUILD (NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]
#pragma mark- 判空
//字符串是否为空
#define ISNullString(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str length] <1? YES : NO )
//数组是否为空
#define ISNullArray(array) (array == nil || [array isKindOfClass:[NSNull class]] || array.count ==0||[array isEqual:[NSNull null]])
//字典是否为空
#define ISNullDict(dic) (dic == nil || [dic isKindOfClass:[NSNull class]] || dic.allKeys ==0|| [dic isEqual:[NSNull null]])
//是否是空对象
#define ISNullObject(_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- 日志
//自定义Log
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(FORMAT, ...) nil
#endif
#pragma mark- 持久化存储
//永久存储对象
#define SetUserDefaults(object, key) \
({ \
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; \
[defaults setObject:object forKey:key]; \
[defaults synchronize]; \
})
//获取对象
#define GetUserDefaults(key) [[NSUserDefaults standardUserDefaults] objectForKey:key]
//删除某一个对象
#define kRemoveUserDefaults(key) \
({ \
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; \
[defaults removeObjectForKey:_key]; \
[defaults synchronize]; \
})
//清除 NSUserDefaults 保存的所有数据
#define kRemoveAllUserDefaults [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]
#pragma mark- 时间对象
// 秒数
#define Seconds(Days) (24.f*60.f*60.f* (Days))
// 毫秒数
#define Milliseconds(Days) (24.f*60.f*60.f*1000.f* (Days))
//获得当前的年份
#define CurrentYear [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]]
//获得当前的月份
#define CurrentMonth [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:[NSDate date]]
//获得当前的日期
#define CurrentDay [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:[NSDate date]]
//获得当前的小时
#define CurrentHour [[NSCalendar currentCalendar] component:NSCalendarUnitHour fromDate:[NSDate date]]
//获得当前的分
#define CurrentMin [[NSCalendar currentCalendar] component:NSCalendarUnitMinute fromDate:[NSDate date]]
//获得当前的秒
#define CurrentSec [[NSCalendar currentCalendar] component:NSCalendarUnitSecond fromDate:[NSDate date]]
#pragma mark- GCD
//延迟执行
CG_INLINE void runTime(CGFloat time ,dispatch_block_t block) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_main_queue(), block);
}
//回到主线程
CG_INLINE void runMain(dispatch_block_t block){
dispatch_async(dispatch_get_main_queue(), block);
}
//只运行一次
CG_INLINE void runOnce(dispatch_block_t block){
staticdispatch_once_tonceToken;
dispatch_once(&onceToken, block);
}
//开辟异步线程
CG_INLINE void runAsyn(dispatch_block_t block){
dispatch_async(dispatch_get_global_queue(0, 0), block);
}
#pragma mark- view获取控制器
//获取当前view视图的父类控制器
CG_INLINE UIViewController* superViewController(UIView *view){
UIResponder*next = [viewnextResponder];
do{
if([nextisKindOfClass:[UIViewControllerclass]]) {
return(UIViewController*)next;
}next = [nextnextResponder];
}while(next !=nil);
return nil;
}