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, CGSizeMake(1024, 1366)) || CGSizeEqualToSize(DevicePortraitModeSize, CGSizeMake(2048, 2732)))

#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;

说明如下:
1.[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>fzzy.ttf</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全局生效。

base项目已更新:[email protected]:ALongWay/base.git

时间: 2024-10-08 12:59:30

App开发流程之通用宏定义及头文件的相关文章

iOS开发ARC与MRC下单例的完整写法与通用宏定义

#import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _NSZone *)zone方法,所以重写该方法,用GCD一次性函数,默认是线程安全的加了一把锁,也可以自己去加锁 @synchronized(self) { if (_instance == nil) { _instance = [super allocWithZone:zone]; } } 2:还要考虑cop

20个可以帮你简化iOS app开发流程的工具

这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker 不仅是一个创建原型的优秀工具,它提供的许多功能还可以帮助你将程序发布到App store中.它集成了Dropbox,Box.net和photo roll,你可以直接

iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具

本文转载至 http://www.cocoachina.com/ios/20130402/5926.html 如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何

app开发流程有哪些

app开发流程是需求方和供求方相互协调的过程,一般分为需求分析.功能设计.功能实现.项目测试.上线等几个步骤,下面我们就来一起看看ytkah团队进行app开发各个流程主要做哪些事情,让您对app开发设计有一个更全面的了解,更放心地将项目交予我们来为您实施. app开发流程1. 需求分析首先要确定项目整体方案,整个项目的规划,大体框架,做成文档展现出来,以便大家提意见和更好的改进.也就是说首先要确立产品原型,进入项目评估阶段.经过反复确认,最终形成产品脑图和完整的需求文档. app开发流程2. 功

IOS开发中常用的宏定义

有些时候,我们需要将代码简洁化,这样便于读代码.我们可以将一些不变的东东抽取出来,将变化的东西作为参数.定义为宏,这样在写的时候就简单多了. 下面例举了一些常用的宏定义和大家分享: 1. 判断设备的操作系统是不是ios7 #define IOS7 ( [[[UIDevice currentDevice].systemVersion doubleValue] >= 7.0] ) 2. 判断当前设备是不是iPhone5 #define kScreenIphone5 (([[UIScreen main

stm32工程建立中关于宏定义和启动文件的选择

在STM32的学习过程中,第一步关于stm32工程的建立就会难倒很多人,因为他不像其他AVR 51单片机这些,options中的配置比较复杂,其中最让人头疼的就是关于c/c++ compiler选项中preprocessor这个选择框,现在我就对其中的两项进行说明,一是为了让以后学习STM32的同学能更快的了解,二是为了让我自己更好的复习. 如上图所示  其中 additional include directories下面的框需要添加工程内头文件所在的路径,'$PROJ_DIR$'表示的是工程

APP开发流程

不论是ios还是android的应用开发,其实都遵循着一定的开发流程,只有如此才能使开发过程有章可循而不是一团乱. 明确你的构想和理念. 1 你的app应用是开发给谁用的? 是写给小孩玩的游戏,还是用来理财的记账类应用,每个应用都有固定的适用人群,而这决定你应用的内容是什么,也决定了要给使用者以什么样的用户体验. 2 你的app应用是做什么的? 一个app有明确的使用目的是必须的.如何来明确?一个办法就是要去想清楚什么能吸引用户来使用你的app. 3 你的app能解决什么问题? 一个app应该致

手机APP开发流程

手 机 APP的开发流程越来越成熟了,因此,每年产生的APP也数以万计.就目前而言,在苹果的IOS平台与谷歌的安卓平台为主流,也有一些开发者仍坚守在 黑莓和微软的操作平台,之所以他们不会放弃黑莓10或Windows Phone 8平台开发,主要是因为苹果严格控制开发商,而Android平台免费 或者质量奇差的应用程序太多.那么手机App软件开发流程是具体怎样的呢? 为此,粗略分享一下App软件程序开发流程. 1)需求分析和产品分析 当收到客户的需求之后,不是马上动手去做功能分析.产品逻辑架构或者

IOS开发,知识点小结,ios开发中常用的宏定义总结

IOS开发,从应用跳转到用浏览器打开网页: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.oatos.com/bbs/"]]; 用一个Button覆盖整个cell,添加动作 cell.accessoryType = UITableViewCellAccessoryNone; UIButton *btn = [[UIButton alloc] initWithFrame:CGRec