宏定義
常用定義
//加載圖片
#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]//蘋方細(xì)體
#define NameBFont(x) [UIFont fontWithName:@"PingFangSC-Regular"size:x]//蘋方體
#define NumFont(x) [UIFont fontWithName:@"Helvetica Neue"size:x]//數(shù)字字體
#define CustomFont(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設(shè)置
// 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.ayer 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- 系統(tǒng)信息
// 當(dāng)前語言
#define CURRENTLANGUAGE ([[NSLocale preferredLanguages] objectAtIndex:0])
// app版本號(hào)
#define VERSION (NSString *)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
// app Build版本號(hào)
#define BUILD (NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]
#pragma mark- 判空
//字符串是否為空
#define ISNullString(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str length] <1? YES : NO )
//數(shù)組是否為空
#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]])
//是否是空對(duì)象
#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- 持久化存儲(chǔ)
//永久存儲(chǔ)對(duì)象
#define SetUserDefaults(object, key) \
({ \
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; \
[defaults setObject:object forKey:key]; \
[defaults synchronize]; \
})
//獲取對(duì)象
#define GetUserDefaults(key) [[NSUserDefaults standardUserDefaults] objectForKey:key]
//刪除某一個(gè)對(duì)象
#define kRemoveUserDefaults(key) \
({ \
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; \
[defaults removeObjectForKey:_key]; \
[defaults synchronize]; \
})
//清除 NSUserDefaults 保存的所有數(shù)據(jù)
#define kRemoveAllUserDefaults [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]
#pragma mark- 時(shí)間對(duì)象
// 秒數(shù)
#define Seconds(Days) (24.f * 60.f * 60.f * (Days))
// 毫秒數(shù)
#define Milliseconds(Days) (24.f * 60.f * 60.f * 1000.f * (Days))
//獲得當(dāng)前的年份
#define CurrentYear [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]]
//獲得當(dāng)前的月份
#define CurrentMonth [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:[NSDate date]]
//獲得當(dāng)前的日期
#define CurrentDay [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:[NSDate date]]
//獲得當(dāng)前的小時(shí)
#define CurrentHour [[NSCalendar currentCalendar] component:NSCalendarUnitHour fromDate:[NSDate date]]
//獲得當(dāng)前的分
#define CurrentMin [[NSCalendar currentCalendar] component:NSCalendarUnitMinute fromDate:[NSDate date]]
//獲得當(dāng)前的秒
#define CurrentSec [[NSCalendar currentCalendar] component:NSCalendarUnitSecond fromDate:[NSDate date]]
常用顏色
// 顏色(RGB)
#define RGB(r, g, b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
#define RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]
// 顏色(16進(jìn)制)
#define HexColor(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16)) / 255.0 green:((float)((hexValue & 0xFF00) >> 8)) / 255.0 blue:((float)(hexValue & 0xFF)) / 255.0 alpha:1.0f]
#define HexAlphaColor(hexValue, alpha) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) >> 16)) / 255.0 green:((float)((hexValue & 0xFF00) >> 8)) / 255.0 blue:((float)(hexValue & 0xFF)) / 255.0 alpha:alpha]
// 隨機(jī)顏色
#define RandomColor [UIColor colorWithRed:arc4random_uniform(256) / 255.0 green:arc4random_uniform(256) / 255.0 blue:arc4random_uniform(256) / 255.0 alpha: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設(shè)置
//是否是手機(jī)
#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 IsiPhone4 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPhone5系列
#define IsiPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPhone6系列
#define IS_isiPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iphone6+系列
#define IsiPhone6Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPhoneX
#define IsIPhone_X ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPHoneXr | 11
#define IsIPhone_Xr ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPhoneXs | 11Pro
#define IsIPhone_Xs ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
// 判斷iPhoneXs Max | 11ProMax
#define IsIPhone_Xs_Max ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iPhone12_Mini
#define IsIPhone_iPhone12_Mini ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1080, 2340), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iPhone12 | 12Pro | 14
#define IsIPhone_iPhone12 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1170, 2532), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iPhone12 Pro Max | 14 Max
#define IsIPhone_iPhone12_ProMax ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1284, 2778), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iPhone14 pro
#define IsIPhone_iPhone14_Pro ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1179, 2556), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//判斷iPhone14 Pro Max
#define IsIPhone_iPhone14_ProMax ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1290, 2796), [[UIScreen mainScreen] currentMode].size) && !IsPad : NO)
//statusbar的高度
#define STATUS_HEIGHT \
({\
CGFloat height = 0.0;\
if (@available(iOS 13.0, *)) {\
CGFloat topHeight = [UIApplication sharedApplication].windows.firstObject.safeAreaInsets.top;\
height = topHeight ? topHeight : 20.0;\
}else {\
height = [[UIApplication sharedApplication] statusBarFrame].size.height;\
}\
(height);\
})\
//底部安全高度
#define BOTTOM_HEIGHT \
({\
CGFloat height = 0.0;\
if (@available(iOS 13.0, *)) {\
NSSet *set = [UIApplication sharedApplication].connectedScenes;\
UIWindowScene *windowScene = [set anyObject];\
UIWindow *window = windowScene.windows.firstObject;\
height = window.safeAreaInsets.bottom;\
} else if (@available(iOS 11.0, *)) {\
UIWindow *window = [UIApplication sharedApplication].windows.firstObject;\
height = window.safeAreaInsets.bottom;\
}\
(height);\
})\
//navigation高度 (帶statusbar)
#define NAVGATION_HEIGHT (STATUS_HEIGHT + 44)
// View 坐標(biāo)(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)
GCD多線程像捶、父視圖獲取
//延遲執(zhí)行
CG_INLINE void loadTime(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);
}
//只運(yùn)行一次
CG_INLINE void runOnce(dispatch_block_t block){
static dispatch_once_t onceToken;
dispatch_once(&onceToken, block);
}
//開辟異步線程
CG_INLINE void runAsyn(dispatch_block_t block){
dispatch_async(dispatch_get_global_queue(0, 0), block);
}
//獲取添加了當(dāng)前view視圖的控制器
CG_INLINE UIViewController *superViewController(UIView *view){
UIResponder *next = [view nextResponder];
do{
if([next isKindOfClass:[UIViewController class]]) {
return(UIViewController*)next;
}next = [next nextResponder];
}while(next != nil);
return nil;
}
//獲取當(dāng)前window展示的控制器
CG_INLINE UIViewController *currentViewController(){
//獲取當(dāng)前活動(dòng)窗口的根數(shù)圖
UIViewController *vc = [UIApplication sharedApplication].keyWindow.rootViewController;
while (1) {
//根據(jù)不同的頁面切換方式瞎饲,逐步獲取最上層的viewController
if ([vc isKindOfClass:[UITabBarController class]]) {
vc = ((UITabBarController *)vc).selectedViewController;
}
if ([vc isKindOfClass:[UINavigationController class]]) {
vc = ((UINavigationController *)vc).visibleViewController;
}
if (vc.presentedViewController) {
vc = vc.presentedViewController;
}else {
break;
}
}
return vc;
}
歡迎補(bǔ)充?懿帧!7肆埂;邸亦渗!