美文网首页02-收集
iOS开发中一些简化代码的宏定义

iOS开发中一些简化代码的宏定义

作者: JerryLMJ | 来源:发表于2016-02-16 23:56 被阅读1248次

前言

今天将一些简化工程代码的宏定义拿出来分享一下,如果大家也有简化代码的相关经验也可以一起来交流。

Application

#define APPLICATION   [UIApplication sharedApplication]
#define APPDLE        (AppDelegate*)[APPLICATION delegate]

布局相关
在纯代码的工程中,由于oc语法本身并不是很简洁的特性,控件布局会占有很大篇幅的代码,如果将一些位置、大小、中心、间隙等写成简短明了的宏定义,就会大大增加代码的可读性(当然Masonry框架也是一个不错的选择)。

  • Frame相关

传参frame对象,获取frame的相关属性值

#define FRAME_ORIGIN(aFrame)              ((aFrame).origin)
#define FRAME_X(aFrame)                   ((aFrame).origin.x)
#define FRAME_Y(aFrame)                   ((aFrame).origin.y)

#define FRAME_SIZE(aFrame)                ((aFrame).size)
#define FRAME_HEIGHT(aFrame)              ((aFrame).size.height)
#define FRAME_WIDTH(aFrame)               ((aFrame).size.width)

/*修改frame对象的x、y、width、height属性值*/ 
#define FRAME_CHANGE_X(aFrame,x)          CGRectMake(x, (aFrame).origin.y, (aFrame).size.width, (aFrame).size.height)
#define FRAME_CHANGE_Y(aFrame,y)          CGRectMake((aFrame).origin.x, y, (aFrame).size.width, (aFrame).size.height)
#define FRAME_CHANGE_WIDTH(aFrame,w)      CGRectMake((aFrame).origin.x, (aFrame).origin.y, w, (aFrame).size.height)
#define FRAME_CHANGE_HEIGHT(aFrame,h)     CGRectMake((aFrame).origin.x, (aFrame).origin.y, (aFrame).size.width, h)

// 向左移动offset位移后得到frame对象
#define FRAME_MOVE_Left(aFrame,offset)    CGRectMake((aFrame).origin.x-(offset), (aFrame).origin.y, (aFrame).size.width, (aFrame).size.height)
// 向右移动offset位移后得到frame对象
#define FRAME_MOVE_Right(aFrame,offset)   CGRectMake((aFrame).origin.x+(offset), (aFrame).origin.y, (aFrame).size.width, (aFrame).size.height)
// 向上移动offset位移后得到frame对象
#define FRAME_MOVE_Up(aFrame,offset)      CGRectMake((aFrame).origin.x, (aFrame).origin.y-(offset), (aFrame).size.width, (aFrame).size.height)
// 向下移动offset位移后得到frame对象
#define FRAME_MOVE_Down(aFrame,offset)    CGRectMake((aFrame).origin.x, (aFrame).origin.y+(offset), (aFrame).size.width, (aFrame).size.height)

传参view对象,获取viewframebounds相关属性值

#define VIEW_BOUNDS(aView)       ((aView).bounds)

#define VIEW_FRAME(aView)        ((aView).frame)

#define VIEW_ORIGIN(aView)       ((aView).frame.origin)
#define VIEW_X(aView)            ((aView).frame.origin.x) 
#define VIEW_Y(aView)            ((aView).frame.origin.y)

#define VIEW_SIZE(aView)         ((aView).frame.size)
#define VIEW_HEIGHT(aView)       ((aView).frame.size.height)  // 视图高度
#define VIEW_WIDTH(aView)        ((aView).frame.size.width)   // 视图宽度

其实本来以下两个宏按照语义想要写成VIEW_Right_X(aView)
VIEW_Bottom_Y(aView),但是由于XCode的自动提示,写成以下形式就会在自动提示列表中与VIEW_X(aView)VIEW_Y(aView)两个宏并列,更方便选择

#define VIEW_X_Right(aView)      ((aView).frame.origin.x + (aView).frame.size.width)  // 视图右边界x坐标
#define VIEW_Y_Bottom(aView)     ((aView).frame.origin.y + (aView).frame.size.height) // 视图底部y坐标
  • Center相关
#define VIEW_CENTER(aView)       ((aView).center)
#define VIEW_CENTER_X(aView)     ((aView).center.x)
#define VIEW_CENTER_Y(aView)     ((aView).center.y)
  • 间距
    有人会说定义这样一个宏并不是简化代码反而增加了代码,确实如此。我们在布局控件的时候经常会涉及+、-一些间距值,当我们回过头阅读那成百上千行代码中+、-的那些值的时候,我们就很难去猜测它们的意义。如果用这样一个宏去表示,就大大增加了代码的可读性。
#define Space_(space)  (space) // 表示整形、浮点型间距

屏幕坐标、尺寸相关

// 状态栏占用高度
#define StateBarHeight          20.f
// 状态栏底部y坐标
#define OffsetStateBarHeight    ((DEVICE_OS_VERSION_VALUE >= 7.0)? StateBarHeight : 0.f)

// 顶部状态栏占用高度
#define TopNavBarHeight         40.f
// 顶部导航栏底部y坐标
#define OffsetTopNavBarHeight   (OffsetStateBarHeight + TopNavBarHeight)

// 底部导航栏占用高度
#define BottomTabBarHeight      40.f


// 屏幕高度
#define ScreenHeight            [[UIScreen mainScreen] bounds].size.height
// 屏幕宽度
#define ScreenWidth             [[UIScreen mainScreen] bounds].size.width

// 屏幕可操作高度
#define MainHeight              ((DEVICE_OS_VERSION_VALUE >= 7.0)? ScreenHeight : (ScreenHeight - StateBarHeight))
// 屏幕可操作宽度
#define MainWidth               ScreenWidth

// 去除上下导航栏剩余中间视图高度
#define ContentHeight           (MainHeight -OffsetTopNavBarHeight -BottomTabBarHeight)

设备系统相关

  • 设备
    这只列出了目前已有的iPhone屏幕尺寸
// x
#define IS_iPhoneX        ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
// 6P、6sP、7P、8P
#define IS_iPhone678_Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
// 6、6s、7、8
#define IS_iPhone678      ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
// 5、5s
#define IS_iPhone5        ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
// 3g、4、4s
#define IS_iPhone34       ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), [[UIScreen mainScreen] currentMode].size) : NO)
// 是否是Retina屏幕
#define IS_Retina      ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? [[UIScreen mainScreen] currentMode].size.width > 320 : NO)
  • 系统相关
// app版本号
#define DEVICE_APP_VERSION       (NSString *)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
// app Build版本号
#define DEVICE_APP_BUILD         (NSString *)[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]

// 系统版本号(string)
#define DEVICE_OS_VERSION        [[UIDevice currentDevice] systemVersion]
// 系统版本号(float)
#define DEVICE_OS_VERSION_VALUE  [DEVICE_OS_VERSION floatValue]
#define IS_IOSVersion_4          (DEVICE_OS_VERSION_VALUE >= 4.0  && DEVICE_OS_VERSION_VALUE < 5.0)
#define IS_IOSVersion_5          (DEVICE_OS_VERSION_VALUE >= 5.0  && DEVICE_OS_VERSION_VALUE < 6.0)
#define IS_IOSVersion_6          (DEVICE_OS_VERSION_VALUE >= 6.0  && DEVICE_OS_VERSION_VALUE < 7.0)
#define IS_IOSVersion_7          (DEVICE_OS_VERSION_VALUE >= 7.0  && DEVICE_OS_VERSION_VALUE < 8.0)
#define IS_IOSVersion_8          (DEVICE_OS_VERSION_VALUE >= 8.0  && DEVICE_OS_VERSION_VALUE < 9.0)
#define IS_IOSVersion_9          (DEVICE_OS_VERSION_VALUE >= 9.0  && DEVICE_OS_VERSION_VALUE < 10.0)
#define IS_IOSVersion_10         (DEVICE_OS_VERSION_VALUE >= 10.0 && DEVICE_OS_VERSION_VALUE < 11.0)
#define IS_IOSVersion_11         (DEVICE_OS_VERSION_VALUE >= 11.0 && DEVICE_OS_VERSION_VALUE < 12.0)

字体相关

  • 字体
#define FONT_SIZE(f)            [UIFont systemFontOfSize:(f)]
#define FONT_BOLD_SIZE(f)       [UIFont boldSystemFontOfSize:(f)]
#define FONT_ITALIC_SIZE(f)     [UIFont italicSystemFontOfSize:(f)]
  • 大小屏字体自动切换
    有的应用希望有一个好的用户体验会在不同的屏幕上适配不同大小字体,这时就可以使用以下的宏定义来实现。但是如果应用中字体大小不能做到全局统一,就不要使用以下的宏定义来实现字体大小适配。这个就看你所开发的具体情况了,例如:
#define IS_SmallScreen (IS_iPhone5 || IS_iPhone4)

#define MaxFontSize    (IS_SmallScreen ? 21.f : 25.f )
#define LagerFontSize  (IS_SmallScreen ? 17.f : 19.f )
#define BigFontSize    (IS_SmallScreen ? 15.f : 17.f )
#define NormalFontSize (IS_SmallScreen ? 13.f : 15.f )
#define SmallFontSize  (IS_SmallScreen ? 11.f : 13.f )
#define MinFontSize    (IS_SmallScreen ? 9.f  : 11.f )

颜色相关

  • 系统颜色
#define COLOR_Clear           [UIColor clearColor]
#define COLOR_White           [UIColor whiteColor]
#define COLOR_Black           [UIColor blackColor]
#define COLOR_Red             [UIColor redColor]
#define COLOR_DarkGray        [UIColor darkGrayColor]
#define COLOR_LightGray       [UIColor lightGrayColor]
#define COLOR_GrayColor       [UIColor grayColor]
#define COLOR_Green           [UIColor greenColor]
#define COLOR_BlueColor       [UIColor blueColor]
#define COLOR_Cyan            [UIColor cyanColor]
#define COLOR_Yellow          [UIColor yellowColor]
#define COLOR_Magenta         [UIColor magentaColor]
#define COLOR_Orange          [UIColor orangeColor]
#define COLOR_Purple          [UIColor purpleColor]
#define COLOR_Brown           [UIColor brownColor]
  • 颜色转换
#define RGBCOLOR(r,g,b)       [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:1.f]
#define RGBACOLOR(r,g,b,a)    [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:(a)]
#define HexCOLOR(HexStr)      [UIColor colorWithHexString:HexStr]
+ (UIColor *)colorWithHexString:(NSString *)color{
    return [self colorWithHexString:color alpha:1.0f];
}


+ (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha{
    NSString *cString = [[color stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
    // String should be 6 or 8 characters
    if ([cString length] < 6) {
        return [UIColor clearColor];
    }
    
    // strip 0X if it appears
    if ([cString hasPrefix:@"0X"])
        cString = [cString substringFromIndex:2];
    if ([cString hasPrefix:@"#"])
        cString = [cString substringFromIndex:1];
    if ([cString length] != 6)
        return [UIColor clearColor];
    
    // Separate into r, g, b substrings
    NSRange range;
    range.location = 0;
    range.length = 2;
    
    //r
    NSString *rString = [cString substringWithRange:range];
    
    //g
    range.location = 2;
    NSString *gString = [cString substringWithRange:range];
    
    //b
    range.location = 4;
    NSString *bString = [cString substringWithRange:range];
    
    // Scan values
    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];
    
    return [UIColor colorWithRed:((float) r / 255.0f) green:((float) g / 255.0f) blue:((float) b / 255.0f) alpha:alpha];
}

字符串相关

#define StrOfInterger(interger)  [NSString stringWithFormat:@"%ld",(long)(interger)]
#define StrOfFloat(float)        [NSString stringWithFormat:@"%f",(float)]

Image相关

#define IMG_Name(imgName)        [UIImage imageNamed:(imgName)]

#define IMG_ImgWidth(img)        ((img).size.width)
#define IMG_ImgHeight(img)       ((img).size.height)

校验相关

#define STRINGHASVALUE(str)  (str && [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]].length > 0)
#define IsCanUseString(str)     ((str != nil) && ![str isKindOfClass:[NSNull class]] && [str isKindOfClass:[NSString class]] && [str length] > 0 )
#define IsCanUseArray(arr)      ( arr && (arr != nil) && ![arr isKindOfClass:[NSNull class]] )
#define IsCanUseDic(dic)        ( dic && (dic != nil) && ![dic isKindOfClass:[NSNull class]] )
#define IsCanUseObj(obj)        ( obj && (obj != nil) && ![obj isKindOfClass:[NSNull class]] )
#define IsNullClass(class)      [class isKindOfClass:[NSNull class]]

打印相关

// mark(NSString类型参数)为打印内容标题
#define NSLOG_Str(mark,str)       NSLog(@"##%@##--str:%@--",(mark),(str))
#define NSLOG_Int(mark,int)       NSLog(@"##%@##--int:%ld--",(mark),(int))
#define NSLOG_Float(mark,float)   NSLog(@"##%@##--float:%f--",(mark),(float))
#define NSLOG_Bool(mark,bool)     NSLog(@"##%@##--bool:%@--",(mark),(bool) ? @"YES" : @"NO")
#define NSLOG_Point(mark,point)   NSLog(@"##%@##--x:%f--y:%f--",(mark),(point).x,(point).y)
#define NSLOG_Size(mark,size)     NSLog(@"##%@##--width:%f--height:%f--",(mark),(size).width,(size).height)
#define NSLOG_Frame(mark,frame)   NSLog(@"##%@##--x:%f--y:%f--width:%f--height:%f--",(mark),(frame).origin.x,(frame).origin.y,(frame).size.width,(frame).size.height)

版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

相关文章

  • iOS 常用宏定义

    iOS 开发中使用一些常用宏定义可以大大提高开发效率,提高代码的重用性.以下是一些常用的宏定义: 像这些宏定义,在...

  • iOS开发中一些简化代码的宏定义

    前言 今天将一些简化工程代码的宏定义拿出来分享一下,如果大家也有简化代码的相关经验也可以一起来交流。 Applic...

  • iOS开发 宏定义

    在iOS开发中,合理的使用宏定义可以使我们少些好多代码 C预定义宏DATE //进行预处理的日期(“Mmm dd...

  • iOS宏一些使用

    在开发中,我们经常需要使用一些宏或者自定义一些宏。 宏是已被命名的代码片段。使用宏时会进行代码段的替换。有两种宏的...

  • IOS开发常用宏定义

    前言 在pch文件中定义常用的宏可以极大的提高开发效率,改善代码臃肿,一下是我开发常用的一些宏定义,供大家参考。 ...

  • ios拓展31-宏(define)和const的正确姿势

    在iOS开发中,经常用到宏定义,但是网上看一些博客的时候,有的说宏定义大量使用会重复拷贝,占用内存. 有的说不会...

  • Swift 声明宏定义

    在iOS开发中,使用Object-C可以定义一些宏,以方便项目中调用,但是Swift语言中,并不支持宏定义,我们可...

  • iOS常用宏 定义

    iOS开发过程中,使用的一些常用宏定义 字符串是否为空#define kStringIsEmpty(str) ([...

  • 获取iOS系统版本,谨慎使用[[[UIDevice curren

    最近分享了iOS开发中相关的一些宏定义,其中涉及到判断iOS的版本号的宏,有简友评论这个方法不靠谱,建议我找个更好...

  • iOS 宏(define)与常量(const)的正确使用

    在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与c...

网友评论

  • 玫瑰花瓣的信笺:系统版本Float这么转有问题吧?如果是10.3.3这种版本,直接float就会出问题。
    JerryLMJ:@玫瑰花瓣的信笺 版本号字符串不就是准确的么
    玫瑰花瓣的信笺:@MajorLMJ 有什么办法精准的判断版本号吗
    JerryLMJ:DEVICE_OS_VERSION_VALUE 确实不能得出一个准确的版本号(10.3.3通过floatValue转小数是没问题的,它得出的是 10.300000 这样一个小数),这个宏的目的并不是获取一个准确的版本号,而是用这个粗略值来做版本适配的,转出的10.300000可以基本满足版本适配的需要了
  • King_mr::scream: 没怎么用过宏 不会用

本文标题:iOS开发中一些简化代码的宏定义

本文链接:https://www.haomeiwen.com/subject/hszpkttx.html