Archivo de encabezado de definición de macro

Prefacio:

En el trabajo, muchos socios pequeños definirán algunas macros de uso común en el archivo PCH, pero temen que escribir estas macros simples sea una pérdida de tiempo y, a veces, se olviden de cómo definirlas. Lo mismo ocurre con mi trabajo. Así que aquí para compartir contigo algunas definiciones de macros de uso común, los amigos que te gustan pueden usar directamente en el proyecto (actualización continua).
Para su comodidad, haga clic en Descargar archivo de encabezado de definición de macro de GitHub.
1. Obtenga el ancho y la altura de la pantalla

#define SCREEN_WIDTH   [UIScreen mainScreen].bounds.size.width
#define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height

De acuerdo con un internauta (fuera del idioma) que se le recordó, si es compatible con la pantalla horizontal, puede usar la siguiente macro:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 // 当前Xcode支持iOS8及以上

#define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.width)
#define SCREENH_HEIGHT ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.height)
#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)
#else
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height
#define SCREEN_SIZE [UIScreen mainScreen].bounds.size
#endif

2. Obtener centro de notificaciones

#define LRNotificationCenter [NSNotificationCenter defaultCenter]

3. Establecer colores aleatorios

#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. Establecer el color RGB / Establecer el color RGBA

#define LRRGBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define LRRGBAColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]

// color de fondo claro

#define LRClearColor [UIColor clearColor]

5. NSLog personalizado y eficiente

Durante el desarrollo del proyecto, agregaremos registros en muchos lugares, pero no queremos usar estos registros al publicar, y no podemos eliminarlos uno por uno, por lo que los registros personalizados son inevitables.

#ifdef DEBUG
#define LRLog(...) NSLog(@"%s 第%d行 \n %@\n\n",__func__,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
#else
#define LRLog(...)

#endif

6. Referencias débiles / Referencias fuertes

#define LRWeakSelf(type)  __weak typeof(type) weak##type = type;
#define LRStrongSelf(type)  __strong typeof(type) type = weak##type;

How to use.png

El segundo método de uso, después de definir la macro de referencia débil, escriba directamente débil.png
7. Establezca las esquinas redondeadas y los bordes de la vista.

#define LRViewBorderRadius(View, Radius, Width, Color)\
\
[View.layer setCornerRadius:(Radius)];\
[View.layer setMasksToBounds:YES];\
[View.layer setBorderWidth:(Width)];\
[View.layer setBorderColor:[Color CGColor]]

8. Convertir de ángulo a radianes convertir de radianes a ángulo

#define LRDegreesToRadian(x) (M_PI * (x) / 180.0)
#define LRRadianToDegrees(radian) (radian*180.0)/(M_PI)

9. Configure el cuadro de aviso de carga (marco de terceros: Toast)

Esta macro definición es muy fácil de usar, pero los amigos necesitan CocoaPods para importar un marco de terceros: Toast

El método de uso es el siguiente:
LRToast (@ ”Error de carga de red”);

#define LRToast(str)              CSToastStyle *style = [[CSToastStyle alloc] initWithDefaultStyle]; \
[kWindow  makeToast:str duration:0.6 position:CSToastPositionCenter style:style];\
kWindow.userInteractionEnabled = NO; \
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    
    \
kWindow.userInteractionEnabled = YES;\
});\

10. Configure el cuadro de aviso de carga (marco de terceros: MBProgressHUD)

Esta macro definición es similar a la anterior, como se muestra a continuación:

MBProgressHUD prompt box.png

// carga

#define kShowNetworkActivityIndicator() [UIApplication sharedApplication].networkActivityIndicatorVisible = YES

// Empacar y cargar

#define HideNetworkActivityIndicator()      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO
// 设置加载
#define NetworkActivityIndicatorVisible(x)  [UIApplication sharedApplication].networkActivityIndicatorVisible = x

#define kWindow [UIApplication sharedApplication].keyWindow

#define kBackView         for (UIView *item in kWindow.subviews) {
    
     \
if(item.tag == 10000) \
{
    
     \
[item removeFromSuperview]; \
UIView * aView = [[UIView alloc] init]; \
aView.frame = [UIScreen mainScreen].bounds; \
aView.tag = 10000; \
aView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; \
[kWindow addSubview:aView]; \
} \
} \

#define kShowHUDAndActivity kBackView;[MBProgressHUD showHUDAddedTo:kWindow animated:YES];kShowNetworkActivityIndicator()

#define kHiddenHUD [MBProgressHUD hideAllHUDsForView:kWindow animated:YES]

#define kRemoveBackView         for (UIView *item in kWindow.subviews) {
    
     \
if(item.tag == 10000) \
{
    
     \
[UIView animateWithDuration:0.4 animations:^{
    
     \
item.alpha = 0.0; \
} completion:^(BOOL finished) {
    
     \
[item removeFromSuperview]; \
}]; \
} \
} \

#define kHiddenHUDAndAvtivity kRemoveBackView;kHiddenHUD;HideNetworkActivityIndicator()

11. Obtenga el recurso de marco / imagen de la vista

//获取view的frame(不建议使用)
//#define kGetViewWidth(view)  view.frame.size.width
//#define kGetViewHeight(view) view.frame.size.height
//#define kGetViewX(view)      view.frame.origin.x
//#define kGetViewY(view)      view.frame.origin.y

// Obtener recursos de imágenes

#define kGetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]]

12. Obtén el idioma actual

#define LRCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])

13. Utilice ARC y MRC

#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif

14. Determine la versión actual del dispositivo / sistema iPhone

// Determina si es un iPhone

#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"])

// Determina si es un iPad

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPAD ([[[UIDevice currentDevice] model] isEqualToString:@"iPad"])

// Juzga si es ipod

#define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"])

// Determina si es iPhone 5SE

#define iPhone5SE [[UIScreen mainScreen] bounds].size.width == 320.0f && [[UIScreen mainScreen] bounds].size.height == 568.0f

// Determina si es iPhone 6 / 6s

#define iPhone6_6s [[UIScreen mainScreen] bounds].size.width == 375.0f && [[UIScreen mainScreen] bounds].size.height == 667.0f

// Determina si es iPhone 6Plus / 6sPlus

#define iPhone6Plus_6sPlus [[UIScreen mainScreen] bounds].size.width == 414.0f && [[UIScreen mainScreen] bounds].size.height == 736.0f

// Obtenga la versión del sistema
// Este método no es particularmente confiable

#define IOS_SYSTEM_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]

// Sugerir usar este método

#define IOS_SYSTEM_STRING [[UIDevice currentDevice] systemVersion]

// Juzgando iOS 8 o una versión superior del sistema

#define IOS_VERSION_8_OR_LATER (([[[UIDevice currentDevice] systemVersion] floatValue] >=8.0)? (YES):(NO))

15. Determina si es una máquina real o un emulador.

// Determine si es un sistema iOS, si es un sistema iOS, tanto la máquina real como la salida del simulador son SÍ

#if TARGET_OS_IPHONE  
#endif  

#if (TARGET_IPHONE_SIMULATOR)    
          // 在模拟器的情况下
#else
         // 在真机情况下
#endif

16. Archivo de catálogo de zona de pruebas

// Obtener temp

#define kPathTemp NSTemporaryDirectory()

// Obtener documento de zona de pruebas

#define kPathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]

// Obtener la caché de Sandbox

#define kPathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

17. Definición de macro de GCD

Muchos amigos son muy molestos para escribir el método GCD, por lo que es más conveniente y conciso definirlo como una macro aquí. Como se muestra abajo:

Cómo utilizar GCD macro.png

// GCD-ejecución única

#define kDISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);

// GCD-ejecutar en el hilo principal

#define kDISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);

// Subproceso asíncrono de GCD-start

#define kDISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), globalQueueBlocl);

El uso de macro y const:

Muchos socios pequeños definen una cadena constante como una macro.El ejemplo más típico es la dirección del servidor. ¡Todos los amigos que usan macros para definir caracteres constantes usarán const para definirlos en el futuro! ¿por qué? Vamos a ver:

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

A través de la comparación anterior, usaremos const si definimos una cadena constante en desarrollo y usamos macros para el código de definición. Echemos un vistazo a cómo usar const y enumeremos el uso real del proyecto como se muestra a continuación:

Declare una cadena constante en FANCommonConst.h.png

Implementar una cadena constante en FANCommonConst.m.png

En la figura anterior, simplemente defino algunas cadenas constantes. Creamos una clase siempre que incluyamos #import en .hy .m

Supongo que te gusta

Origin blog.csdn.net/woruosuifenglang/article/details/54929680
Recomendado
Clasificación