在这里给大家分享一些常用的宏定义,喜欢的小伙伴可以直接在项目中使用(持续更新)!
为了大家使用方便,请点击GitHub - 宏定义头文件下载 !

1.获取屏幕宽度与高度
  1. #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
  2. #define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height

根据一个网友(脱离语言)提醒, 如果支持横屏可以用下面的宏:

  1. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 // 当前Xcode支持iOS8及以上
  2. #define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.width)
  3. #define SCREENH_HEIGHT ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.height)
  4. #define SCREEN_SIZE ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?CGSizeMake([UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale,[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale):[UIScreen mainScreen].bounds.size)
  5. #else
  6. #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
  7. #define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height
  8. #define SCREEN_SIZE [UIScreen mainScreen].bounds.size
  9. #endif
2.获取通知中心
  1. #define LRNotificationCenter [NSNotificationCenter defaultCenter]
3.设置随机颜色
  1. #define LRRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]
4.设置RGB颜色/设置RGBA颜色
  1. #define LRRGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
  2. #define LRRGBAColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]
  3. // clear背景颜色
  4. #define LRClearColor [UIColor clearColor]
5.自定义高效率的 NSLog

项目开发中,我们会在许多地方加上Log,但是发布的时候又不想用这些Log,我们也不可能一个一个的删除,所以自定义Log是必然的!

  1. #ifdef DEBUG
  2. #define LRLog(...) NSLog(@"%s 第%d行 \n %@\n\n",__func__,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
  3. #else
  4. #define LRLog(...)
  5. #endif
6.弱引用/强引用
  1. #define LRWeakSelf(type) __weak typeof(type) weak##type = type;
  2. #define LRStrongSelf(type) __strong typeof(type) type = weak##type;

使用方法.png

第二种使用方法,定义完弱引用宏之后,直接敲weak.png
7.设置 view 圆角和边框
  1. #define LRViewBorderRadius(View, Radius, Width, Color)\
  2. \
  3. [View.layer setCornerRadius:(Radius)];\
  4. [View.layer setMasksToBounds:YES];\
  5. [View.layer setBorderWidth:(Width)];\
  6. [View.layer setBorderColor:[Color CGColor]]
8.由角度转换弧度 由弧度转换角度
  1. #define LRDegreesToRadian(x) (M_PI * (x) / 180.0)
  2. #define LRRadianToDegrees(radian) (radian*180.0)/(M_PI)
9.设置加载提示框(第三方框架:Toast

此宏定义非常好用,但是小伙伴需要CocoaPods导入第三方框架:Toast

使用方法如下:
LRToast(@"网络加载失败");

  1. #define LRToast(str) CSToastStyle *style = [[CSToastStyle alloc] initWithDefaultStyle]; \
  2. [kWindow makeToast:str duration:0.6 position:CSToastPositionCenter style:style];\
  3. kWindow.userInteractionEnabled = NO; \
  4. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\
  5. kWindow.userInteractionEnabled = YES;\
  6. });\
10.设置加载提示框(第三方框架:MBProgressHUD

此宏定义同上一个类似,如下图:

MBProgressHUD提示框.png
  1. // 加载
  2. #define kShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES
  3. // 收起加载
  4. #define HideNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
  5. // 设置加载
  6. #define NetworkActivityIndicatorVisible(x) [UIApplication sharedApplication].networkActivityIndicatorVisible = x
  7. #define kWindow [UIApplication sharedApplication].keyWindow
  8. #define kBackView for (UIView *item in kWindow.subviews) { \
  9. if(item.tag == 10000) \
  10. { \
  11. [item removeFromSuperview]; \
  12. UIView * aView = [[UIView alloc] init]; \
  13. aView.frame = [UIScreen mainScreen].bounds; \
  14. aView.tag = 10000; \
  15. aView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; \
  16. [kWindow addSubview:aView]; \
  17. } \
  18. } \
  19. #define kShowHUDAndActivity kBackView;[MBProgressHUD showHUDAddedTo:kWindow animated:YES];kShowNetworkActivityIndicator()
  20. #define kHiddenHUD [MBProgressHUD hideAllHUDsForView:kWindow animated:YES]
  21. #define kRemoveBackView for (UIView *item in kWindow.subviews) { \
  22. if(item.tag == 10000) \
  23. { \
  24. [UIView animateWithDuration:0.4 animations:^{ \
  25. item.alpha = 0.0; \
  26. } completion:^(BOOL finished) { \
  27. [item removeFromSuperview]; \
  28. }]; \
  29. } \
  30. } \
  31. #define kHiddenHUDAndAvtivity kRemoveBackView;kHiddenHUD;HideNetworkActivityIndicator()
11.获取view的frame/图片资源
  1. //获取view的frame(不建议使用)
  2. //#define kGetViewWidth(view) view.frame.size.width
  3. //#define kGetViewHeight(view) view.frame.size.height
  4. //#define kGetViewX(view) view.frame.origin.x
  5. //#define kGetViewY(view) view.frame.origin.y
  6. //获取图片资源
  7. #define kGetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]]
12.获取当前语言
  1. #define LRCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
13.使用 ARC 和 MRC
  1. #if __has_feature(objc_arc)
  2. // ARC
  3. #else
  4. // MRC
  5. #endif
14.判断当前的iPhone设备/系统版本
  1. //判断是否为iPhone
  2. #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
  3. #define IS_IPHONE ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"])
  4. //判断是否为iPad
  5. #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  6. #define IS_IPAD ([[[UIDevice currentDevice] model] isEqualToString:@"iPad"])
  7. //判断是否为ipod
  8. #define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"])
  9. // 判断是否为 iPhone 5SE
  10. #define iPhone5SE [[UIScreen mainScreen] bounds].size.width == 320.0f && [[UIScreen mainScreen] bounds].size.height == 568.0f
  11. // 判断是否为iPhone 6/6s
  12. #define iPhone6_6s [[UIScreen mainScreen] bounds].size.width == 375.0f && [[UIScreen mainScreen] bounds].size.height == 667.0f
  13. // 判断是否为iPhone 6Plus/6sPlus
  14. #define iPhone6Plus_6sPlus [[UIScreen mainScreen] bounds].size.width == 414.0f && [[UIScreen mainScreen] bounds].size.height == 736.0f
  15. //获取系统版本
  16. //这个方法不是特别靠谱
  17. #define IOS_SYSTEM_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
  18. //建议使用这个方法
  19. #define IOS_SYSTEM_STRING [[UIDevice currentDevice] systemVersion]
  20. //判断 iOS 8 或更高的系统版本
  21. #define IOS_VERSION_8_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue] >=8.0)? (YES):(NO))
15.判断是真机还是模拟器
  1. #if TARGET_OS_IPHONE
  2. //iPhone Device
  3. #endif
  4. #if TARGET_IPHONE_SIMULATOR
  5. //iPhone Simulator
  6. #endif
16.沙盒目录文件
  1. //获取temp
  2. #define kPathTemp NSTemporaryDirectory()
  3. //获取沙盒 Document
  4. #define kPathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
  5. //获取沙盒 Cache
  6. #define kPathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
17.GCD 的宏定义

很多小伙伴都非常烦写GCD的方法,所以在此定义为宏使用更加方便简洁!如下图:

GCD 宏使用方法.png
  1. //GCD - 一次性执行
  2. #define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);
  3. //GCD - 在Main线程上运行
  4. #define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);
  5. //GCD - 开启异步线程
  6. #define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);

宏与const 的使用:

很多小伙伴在定义一个常量字符串,都会定义成一个宏,最典型的例子就是服务器的地址。在此所有用宏定义常量字符的小伙伴以后就用const来定义吧!为什么呢 ?我们看看:

  • 宏的用法: 一般字符串抽成宏,代码抽成宏使用。
  • const用法:一般常用的字符串定义成const(对于常量字符串苹果推荐我们使用const)。
  • 宏与const区别:
    1.编译时刻不同,宏属于预编译 ,const属于编译时刻
    2.宏能定义代码,const不能,多个宏对于编译会相对时间较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间。
    3.宏不会检查错误,const会检查错误

通过以上对比,我们以后在开发中如果定义一个常量字符串就用const,定义代码就用宏。我们来看看如何使用const,列举实际项目使用方法如下图:

FANCommonConst.h中声明一个常量字符串.png

FANCommonConst.m中实现一个常量字符串.png

在上图本人只是简单定义几个常量字符串,我们创建一个类只要在.h.m中包含#import <Foundation/Foundation.h>就可以,然后再.h文件声明一个字符串,在.m中实现就可以了,最后把这个类导入PCH文件中,我们就可任意的发挥啦!

如果喜欢的小伙伴请点一个吧,欢迎留言补充与给出不足之处!

文/判若两人丶(简书作者)
原文链接:http://www.jianshu.com/p/213b3b96cafe
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS常用宏定义--实用的更多相关文章

  1. iOS - 常用宏定义和PCH文件知识点整理

    (一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //=============== ...

  2. iOS常用宏 定义

    总结了iOS开发过程中的一些常用宏,以后会陆陆续续添加进来. 字符串是否为空 1   #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull c ...

  3. iOS常用宏定义大全

    宏定义与常量的区别 宏:只是在预处理器里进行文本替换,不做任何类型检查,宏能定义代码,const不能,多个宏编译时间相对较长,影响开发效率,调试过慢,const只会编译一次,缩短编译时间. 所以在使用 ...

  4. iOS常用宏定义

    转发:https://www.douban.com/note/486674206/ #ifndef MacroDefinition_h#define MacroDefinition_h //----- ...

  5. (转)iOS 常用宏定义

    #ifndef MacroDefinition_h #define MacroDefinition_h   //-------------------获取设备大小------------------- ...

  6. IOS - 常用宏定义和功能方法

    可能不定期添加新的东西 github地址:https://github.com/yuqingzhude/CommonUseDemo /************************Tools**** ...

  7. IOS 程序员开发最常用宏定义

    网上对IOS的宏定义比较多,我总结了一些最常用的宏,后续还会继续补上. 1.首次启动判断: #define First_Launched @"firstLaunch" 2.ios7 ...

  8. ios 常用宏(copy)

    分享一下我现在用的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...

  9. iOS 使用宏定义函数和代码块

    iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它.当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直 ...

随机推荐

  1. 剑指offer笔记面试题14----剪绳子

    题目:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n > 1 并且m > 1),每段绳子的长度记为k[0], k[1], ...k[m].请问k[0] x k[1] x .. ...

  2. Taro自定义Modal对话框组件|taro仿微信、android弹窗

    基于Taro多端实践TaroPop:自定义模态框|dialog对话框|msg消息框|Toast提示 taro自定义弹出框支持编译到多端H5/小程序/ReactNative,还可以自定义弹窗类型/弹窗样 ...

  3. [转]UiPath: How to Capture a Mouse Event on Hover Menus?

    本文转自:https://www.uipath.com/kb-articles/how-to-capture-mouse-event-on-hover-menus he Knowledgebase a ...

  4. Vue组件通信的几种方法

    上一节说到,vue.js是允许子组件通过props接受父组件的信息,但是不允许父组件通过props接受子组件的信息 1. $emit()和on 当子组件需要向父组件传递数据时,就要用到自定义事件. 使 ...

  5. JS For

    JS For 循环可以将代码块执行指定的次数. JavaScript 循环 document.write(cars[0] + "<br>"); document.wri ...

  6. 修改robotframework的元素定位方式,使之支持带括号的xpath定位方式

    今天困扰我的一个问题终于解决了 robot框架默认的xpth定位方式是不支持带括号运算的xpth表达式的,例如: (//*[@content-desc="iv_message_icon_21 ...

  7. python简单处理excel方法

    python自带xlrd和xlwt模块用来处理excel,但总觉得xlwt模块用着别扭,于是按自己的习惯重新封装了一个 # coding=utf- import xlrd # 读模块 import x ...

  8. NOI Linux vim配置文件

    set nu " set mu set ruler color torte set tabstop=4 set shiftwidth=4 set autoindent set cindent ...

  9. C++并发编程实战

    第1章 你好,C++并发世界 第2章 管理线程 第3章 在线程间数据共享 第4章 同步并发操作 第5章 C++内存模型和原子类型操作 第6章 设计基于锁的并发数据结构 第7章 设计无锁的并发数据结构 ...

  10. x86-64数据格式、通用寄存器与操作数格式

    x86-64数据格式.通用寄存器与操作数格式 数据格式 ​ Intel用术语"字(word)"表示16位数据类型,32位为"双字(double words)", ...