App开发流程之通⽤宏定义及头⽂件
⼯欲善其事,必先利其器。
在正式实现各种炫酷的功能和UI前,做好准备⼯作是提⾼后续开发效率的必经之路。
所以,这个系列,我不是在各种堆技术,更关注的是“兵马动”之前的“粮草⾏”,有些繁琐,但当清晰理出整个脉络,后续的⼯作只是在良好的基础和框架上⽆限扩展和优化。
宏定义,是开发过程中提⾼效率的有效⼯具。很有必要归纳⼀些全局通⽤的宏定义,以便简单⾼效的使⽤。
如下,整理了⼀些通⽤宏定义,应该是开发必备的:
#pragma mark -- 设置全局尺⼨宏
#define StatusBarHeight                20
#define NaviBarHeight                  44
#define TabBarHeight                    49
#define KeyboardEngHeight              216
#define KeyboardHansHeight              252
#pragma mark -- 设置全局颜⾊宏
//下列宏定义,只作为⼀种设备适配参考⽅案
#define StatusBarColor                  [UIColor blackColor]
#define NaviBarColor                    [UIColor whiteColor]
#define NaviBarTitleSelectedColor      COLOR(255, 120, 100)
#define NaviBarTitleUnselectedColor    COLOR(100, 100, 100)
#define NaviBarShadowColor              COLOR(230, 230, 230)
#define NaviBarTitleFontSize            ((DeviceIsNotRetina || DeviceIsiPhone4s || DeviceIsiPhone5) ? 17 : 19)
#define NaviBarTitleAttributes          [NSDictionary dictionaryWithObjectsAndKeys:FONTAppliedFixed(NaviBarTitleFontSize),NSFontAttributeName,NaviBarTitleUnselectedColor, NSForegroundColorAttributeName, nil]
#define NaviItemTextFontSize            ((DeviceIsNotRetina || DeviceIsiPhone4s || DeviceIsiPhone5) ? 14 : 16)
#define NaviItemTextGrayColor          COLOR(140, 140, 140)
#define NaviBottomLineColor            NaviBarTitleSelectedColor
#pragma mark -- 字符串本地化宏
#define LocalizedString(String)        NSLocalizedString(String,String)
#pragma mark -- 获取设备宽度和⾼度
//会随着应⽤内部横屏和竖屏变化
#define DeviceSize                      [UIScreen mainScreen].bounds.size
#define DeviceWidth                    DeviceSize.width
#define DeviceHeight                    DeviceSize.height
#pragma mark -- 判断是否iPhone4,4s,5,6,plus,iPad
//不会随着应⽤内部横屏和竖屏变化
#define DeviceCurrentModeSize          [UIScreen mainScreen].currentMode.size
#define DevicePortraitModeSize          (DeviceCurrentModeSize.width < DeviceCurrentModeSize.height ? DeviceCurrentModeSize : CGSizeMake(DeviceCurrentModeSize.height, DeviceCurrentModeSize.width))
#define DeviceIsNotRetina              CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(320, 480))
#define DeviceIsiPhone4s                CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(640, 960))
#define DeviceIsiPhone5                CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(640, 1136))
//6s与6同尺⼨
#define DeviceIsiPhone6                CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(750, 1334))
//6s Plus 与 6Plus同尺⼨(部分机型实际上只有6s的bounds.size)
#define DeviceIsiPhone6plus            (CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(1125, 2001)) || CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(1242, 2208)))
//在模拟器上调试,可能会遇到⾮Retina分辨率的情况
#define DeviceIsiPad                    (CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(768, 1024)) || CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(1536, 2048)) || CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMak #pragma mark -- 判断设备操作系统整数版本号
//当前系统版本号取得仍为浮点型
#define DeviceIOSVersion                [[[UIDevice currentDevice] systemVersion] floatValue]
#define DeviceIOSVersionIs(x)          (DeviceIOSVersion >= x && DeviceIOSVersion < x+1 ? YES : NO)
#define DeviceIOSVersionAbove(x)        (DeviceIOSVersion >= x ? YES : NO)
#pragma mark -- 根据设备,计算标注图中当前缩放尺⼨(标注图版本:375宽度) iPad以iPhone6为标准显⽰
//下列宏定义,只作为⼀种设备适配参考⽅案
#define ResizeSideBase6(s)              (DeviceIsiPad ? s : (DeviceWidth * s / 375))
#pragma mark -- 只根据设计图(标注图版本:375宽度)的宽度等⽐缩放
#define ResizeSideBase375(s)            (DeviceWidth * s / 375)
#pragma mark -- 设置⾃定义字体
#define FontName1                      @"FZY3JW--GB1-0"//⽅正准圆ttf字体名称
#define FontName2                      @"Helvetica"
#define FontName3                      @"Helvetica-Bold"
//固定字体⼤⼩
#define FONTAppliedFixed(n)            [UIFont systemFontOfSize:n]
#define FONTAppliedBoldFixed(n)        [UIFont boldSystemFontOfSize:n]
#define FONTFZZYFixed(n)                [UIFont fontWithName:FontName1 size:n]
#define FONTHelveticaFixed(n)          [UIFont fontWithName:FontName2 size:n]
#define FONTHelveticaBoldFixed(n)      [UIFont fontWithName:FontName3 size:n]
//下列宏定义,只作为⼀种设备适配参考⽅案
//根据设备,计算显⽰字体(标注图版本:375宽度) iPad以iPhone6为标准显⽰
#define FONTAppliedBase6(n)            (DeviceIsiPhone6plus ? FONTAppliedFixed(n+0.5) : (DeviceIsiPhone6 || DeviceIsiPad ? FONTAppliedFixed(n) : FONTAppliedFixed(n-1)))
#define FONTAppliedBoldBase6(n)        (DeviceIsiPhone6plus ? FONTAppliedBoldFixed(n+0.5) : (DeviceIsiPhone6 || DeviceIsiPad ? FONTAppliedBoldFixed(n) : FONTAppliedBoldFixed(n-1)))
#define FONTHelveticaBase6(n)          (DeviceIsiPhone6plus ? FONTHelveticaFixed(n+0.5) : (DeviceIsiPhone6 || DeviceIsiPad ? FONTHelveticaFixed(n) : FONTHelveticaFixed(n-1)))
#define FONTHelveticaBoldBase6(n)      (DeviceIsiPhone6plus ? FONTHelveticaBoldFixed(n+0.5) : (DeviceIsiPhone6 || DeviceIsiPad ? FONTHelveticaBoldFixed(n) : FONTHelveticaBoldFixed(n-1)))
#pragma mark -- 加载图⽚宏(下列⽅法频繁IO,不缓存图⽚):
#define LOADIMAGE(name)                [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]]
#define LOADIMAGEWITHTYPE(name,type)    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:type]]
#pragma mark -- 设置16进制RGB颜⾊(格式:RRGGBB)
#define COLORWITHRRGGBBA(RRGGBB, A)    [UIColor colorWithRed:((float)((RRGGBB & 0xFF0000) >> 16))/255.0 green:((float)((RRGGBB & 0xFF00) >> 8))/255.0 blue:((float)(RRGGBB & 0xFF))/255.0 alpha:A]
#define COLORWITHRRGGBB(RRGGBB)        COLORWITHRRGGBBA(RRGGBB, 1.0)
#pragma mark -- 设置10进制RGB颜⾊
#define COLORWITHRGBA(R, G, B, A)      [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A]
#define COLOR(R, G, B)                  COLORWITHRGBA(R, G, B, 1.0)
#define COLORWITHIMAGE(name)            [UIColor colorWithPatternImage:LOADIMAGE(name)]
#pragma mark -- ⾓度弧度转换
#define DegreesToRadian(x)              (M_PI * x / 180.0)
#define RadianToDegrees(radian)        (radian * 180.0 / M_PI)
#pragma mark -- log输出控制宏
#ifdef  DEBUG
#define LOG(...)                        NSLog(__VA_ARGS__);
#define LOG_METHOD                      NSLog(@"%s", __func__);
#else
#define LOG(...)                        ;
#define LOG_METHOD                      ;
#endif
#pragma mark -- 弱引⽤宏定义
#define WS(weakSelf)                    __weak typeof(self) weakSelf = self;
说明如下:
字体下载免费的app1.[UIScreen mainScreen].bounds.size会随着横屏和竖屏变化,[[UIScreen mainScreen] currentMode].size不会随之改变。
 例如,将⼯程General中横屏勾选上,在iPhone6s上运⾏,⼀开始为竖屏(375,667),应⽤旋转到横屏后,前者宽⾼对调(667,375);后者始终为(750,1334)
2.DeviceIsiPhone6plus 判断是否为6Plus时候,遇到过⼀些分辨率实际为(1125, 2001)的测试机,也就是说bounds.size为(375,667),猜测是翻新机
3.DeviceIsiPad判断iPad时候,多了⾮Retina分辨率的⽐对。因为在iPad上调试仅为iPhone类型的应⽤,会遇到此类型的分辨率
4.ResizeSide和FONT系列的宏定义,提供了宽度和字体⽤代码适配多设备的简单参考⽅案,当然Masonry类库是代码适配设备最好的⽅案,这⾥只是⽤于便捷使⽤
5.LOADIMAGE宏定义,采⽤了频繁IO的⽅式来加载图⽚资源,⽬的是避免内存的缓存长时间占⽤。建议需要保留对象时候,增加属性或者变量引⽤即可
6.若引⽤宏定义中,__weak typeof(self) weakSelf = self;写法中的typeof也可以替换为旧版__typeof,不过建议使⽤新的写法,即typeof
着重记录⼀下⾃定义字体的使⽤
之前在配置Info.plist⽂件时候,添加了字体的键值对,现在就可以派上⽤途了。
1.先将.ttf字体添加到项⽬中,然后在Info.plist⽂件的Source code中,在UIAppFonts键下增加如下代码:
<key>UIAppFonts</key>
<array>
<string&f</string>
</array>
当然,也可以在列表模式下,到Fonts provided by application键,然后添加⼀个item,将ttf⽂件的名称填⼊其中。
2.在合适的地⽅(例如AppDelegate的应⽤启动后的代理⽅法中)使⽤如下代码:
for (NSString* familyName in [UIFont familyNames]) {
LOG(@"familyName : %@", familyName);
for (NSString* fontName in [UIFont fontNamesForFamilyName:familyName]) {
LOG(@"fontName : %@", fontName);
}
}
3.运⾏应⽤后,在控制台查看字体输出log,既然⽤的是fzzy字体,所以实际名称应该类似。所以到了“FZY3JW--GB1-0”这样的字体名称
4.可以查看FONTFZZYFixed宏定义的字体显⽰效果
需要注意的是,同⼀字体族中,细体、粗体、斜体等,都是不同的字体名称,可以理解为在使⽤不同的字体。⼀个ttf字体⽂件,⼀般只有⼀种字体,具体情况需要查看控制台输出的字体log。
头⽂件的使⽤
在Supporting Files⽂件⽬录下创建头⽂件:
我将通⽤宏定义放⼊了CommonHeader.h,便于统⼀管理以及扩充。
类似的,不同类型宏定义,建议组织为不同头⽂件,例如:StringsHeader.h,ImagesHeader.h,URLsHeader.h。
最后,将所有头⽂件统的引⽤统⼀加⼊到预编译头⽂件中PrefixHeader.h全局⽣效。
============================================
2016.09.21更新
补充记录⼀下#define和const的⽐较
#define宏定义可以预编译⼀些代码,简化逻辑,提⾼复⽤率。但是容易被覆盖,Xcode会提⽰。
const常量定义,是运⾏时分配内存和初始化,不允许修改,但是只能适⽤于常⽤数据类型的常量。
⼤量的宏定义肯定是会影响编译效率乃⾄应⽤体积的,配合适⽤应该是最佳的。
const的⽤法有如下⼏种:
3.NSString const *c = @"c";
4.NSString *const d = @"d";
理解规律就是:const右边的部分不允许再修改。
第⼀种,a不能修改;第⼆、三种⼀样,都是*b、*c不能修改,即地址;第四种,是d不能修改,即内容。base项⽬已更新:git@github:ALongWay/base.git

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。