工欲善其事,必先利其器. 在正式实现各种炫酷的功能和UI前,做好准备工作是提高后续开发效率的必经之路. 所以,这个系列,我不是在各种堆技术,更关注的是“兵马动”之前的“粮草行”,有些繁琐,但当清晰理出整个脉络,后续的工作只是在良好的基础和框架上无限扩展和优化. 宏定义,是开发过程中提高效率的有效工具.很有必要归纳一些全局通用的宏定义,以便简单高效的使用. 如下,整理了一些通用宏定义,应该是开发必备的: #pragma mark -- 设置全局尺寸宏 #define StatusBarHeight…
#define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到预处理之后的编译阶段才能发现 带参数宏定义:#define 标识符(参数表)字符序列 如:#define MAX(A, B) ((A) > (B)?(A):(B)) 代码 x = MAX(p, q)将被替换成 y = (p) > (q)? (p):(q) 注意: 1.宏名标识符与左圆括号之间不允许…
#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开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker 不仅是一个创建原型的优秀工具,它提供的许多功能还可以帮助你将程序发布到App store中.它集成了Dropbox,Box.net和photo roll,你可以直接…
如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker ($39.99)不仅是一个创建原…
app开发流程是需求方和供求方相互协调的过程,一般分为需求分析.功能设计.功能实现.项目测试.上线等几个步骤,下面我们就来一起看看ytkah团队进行app开发各个流程主要做哪些事情,让您对app开发设计有一个更全面的了解,更放心地将项目交予我们来为您实施. app开发流程1. 需求分析首先要确定项目整体方案,整个项目的规划,大体框架,做成文档展现出来,以便大家提意见和更好的改进.也就是说首先要确立产品原型,进入项目评估阶段.经过反复确认,最终形成产品脑图和完整的需求文档. app开发流程2. 功…
在使用C++进行程序开发的时候,有个常识我们很熟悉,就是把类的定义写在.h文件中,把类的具体实现写在.cpp文件中.这毫无疑问是对的.但我们很少去思考为什么要这样做,本文结合自己的学习体会,对头文件及const对象的定义进行一些说明. 1.为什么要使用头文件 使用头文件就是为了在希望使用一些共同函数或数据的时候,只需包含这个文件就能实现,无需多次重复编写相同的代码,提高了效率. 2.什么东西可以写在头文件中 在头文件中,我们的编程经验是,函数的声明,类的定义等等应该写在头文件里面.但具体哪些可以…
在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog(...) NSLog(__VA_ARGS__) #define GLLogMethod NSLog(@"%s", __func__) #else // 发布状态, 关闭LOG功能 #define GLLog(...) #define GLLogMethod #endif 颜色 #defin…
常州做APP开发公司紫竹云科技分析,智能硬件产品的软件开发,除了APP和后台之外还有一个固件端的开发,由于固件是要运行产品上的,不过此时的硬件也是刚开始进行研发,所以是无法提供硬件来运行固件的.因此在项目前期固件端的开发通常是先使用开发板来代替产品本身的,等主板设计好可使用时就可以转移到实际产品上进行开发了. 相比纯软件项目,智能硬件从交互上面会更加复杂,所以在三方联调上面会花费更多的时间也会出现更多的问题,因此就需要对产品进行详尽的测试,前期可以使用开发板大致的进行测试,不过由于开发板和实际产…
不久前做过一个小项目种用到了就记录下来方便自己以后使用,一个非常实用的宏定义来打印函数名称等 #ifdef DEBUG #define DebugLog(fmt, ...) NSLog((@"\n[文件名:%s]\n""[函数名:%s]\n""[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__); #else #define DebugLog(...); #endif…
记录状态栏和导航栏的设置和控制,统一在基类视图控制器中完成. 状态栏. 状态栏高度为20,iOS7以后背景完全透明. 样式枚举如下: typedef NS_ENUM(NSInteger, UIStatusBarStyle) { UIStatusBarStyleDefault                                     = 0, // Dark content, for use on light backgrounds UIStatusBarStyleLightCont…
在继续增加预编译头文件前,先稍等. Xcode为我们创建了一个模板项目,很棒!但有一点不太令人满意,问题就在下图中: 这是一个新项目的初始文件目录,几乎所有文件都在同一级目录下,随着项目文件数量急速增加,这将是一场噩梦.所以,我们需要整理一下文件结构,这也算是初步的项目构架了. 还要注意一点,Xcode的base目录下,应该是有一个“Supporting Files”文件夹的,main.m文件在其中,而两个storyboard文件是在base目录下的.可是物理目录下,并非如此.因为Xcode的文…
我的开发环境为:Mac OS X EI Capitan(10.11.6),Xcode 7.3.1 首先说明一下这个项目的初衷,我并非要创建一个完整的上架应用,旨在创建一个可运行的,通用配置.架构,提供通用组件和辅助工具的基础项目.以达到,克隆或者下载就可以快速装配新项目,聚焦于实际的应用逻辑开发.所以,我命名这个项目为“base”,而且项目会在github上同步,可以配合博客和git提交日志查看. 我以Single View Application为例,创建项目.我习惯于纯代码编程,该模板初始结…
科技优家 2016-09-08 18:10 从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累. 我建议先将基础的工具加入项目,后续的开发效率会呈指数增长.如果在专注功能开发过程中,才发现缺少大量常用的工具,不仅会打断思路,还会拖慢开发节奏. 当然,在每个项目开始的时候,不可能将全部工具都准备充分,只能依据个人的经验来评估需要提前准备的工具. 一个好的工匠,必须要有一个好的工具箱,并且还要不断优化它. 稍微扩展一下项目架构. 1.在base目录下为项目增加“Utilities”文件夹作为…
iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方案是,采用私有变量和Api,完成手势交互和返回功能,自定义手势触发条件和额外功能. 另一种实现方案是,采用UINavigationController的代理方法实现交互和动画: - (nullable id <UIViewControllerInteractiveTransitioning>)na…
(一)PCH文件操作步骤演示: 第一步:图文所示: 第二步:图文所示: (二)常用宏定义整理: (1)常用Log日志宏(输出日志详细可定位某个类.某个函数.某一行) //============================================================NSLog #ifdef DEBUG #define DDLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE…
1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.CMOS拾音器:声电转换装置(咪头).音频放大电路2.数据编码:使用相关硬件或软件对音视频原始数据进行编码处理(数字化)及加工(如音视频混合.打包封装等),得到可用的音视频数据涉及技术或协议:编码方式:CBR.VBR编码格式视频:H.265.H.264.MPEG-4等,封装容器有TS.MKV.AVI.…
base项目已经可以编译运行了,只不过没有实际功能而已.继续完善base项目前,我们需要考虑一下代码管理的事情了. 不管是一个人开发还是一个团队开发,对源代码进行版本管理是必须的,任何人对代码的的任何操作都可以被管理,理由还不够充分么. 以前使用过SVN,不过体验最好的,还是Git方式. 1.本地仓库简单易用,可以完全脱离远程仓库来使用2.所有主干和分支都统一管理,切换自如3.合并代码轻松愉快 Xcode自带代码Git管理,创建项目时候就提到过,当时有建议不采用,因为准备使用其他的管理工具.如果…
1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.CMOS拾音器:声电转换装置(咪头).音频放大电路2.数据编码:使用相关硬件或软件对音视频原始数据进行编码处理(数字化)及加工(如音视频混合.打包封装等),得到可用的音视频数据涉及技术或协议:编码方式:CBR.VBR编码格式视频:H.265.H.264.MPEG-4等,封装容器有TS.MKV.AVI.…
1.申请一个开发者账号: 2. App的idea形成: 3. App的主要功能设计: 4. App的大概界面构思和设计(使用流程设计): 5. 大功能模块代码编写: 6. 大概的界面模块编写: 7. 把大概的界面和功能连接后,app的大致demo就出来了: 8. demo自己试用和体验几遍后,根据情况修改: 9. app的0.8左右版本完成后可以加入production的图标和部分UI图片: 10. 没有大错误后,0.9版本可以尝试寻找beta用户: 11. 根据测试用户的反馈,重复 7 - 9…
GCD即为Grand Central Dispatch的缩写,是一种主要用于异步处理任务的安全的高性能解决方案. 在此不对比其他异步处理技术,只记录GCD的使用及说明. 先记录一些必要的概念:线程,同步,异步,并行队列,串行队列 线程:程序中任务执行流的最小单元.一个应用程序,一般存在一个进程(拥有独立内存空间),而每个进程可以有多个线程,即多个任务执行流,类似于工厂车间的流水线.每个应用程序至少存在一个线程,即为主线程,作为唯一可以控制UI的线程. 同步:主要指多个任务在同一个线程上依次执行.…
先罗列一下工具类中提供的方法: /** * 根据原始view和毛玻璃样式,获取模糊视图,并自动作为原view的subview(如果不需要作为子视图,自行调用removeFromSuperview) */ + (UIView *)getBlurEffectViewWithOriginalView:(UIView *)originalView style:(ImageHelperBlurEffectStyle)style; /** * 根据原始图像和毛玻璃样式,获取新图像 */ + (UIImage…
整理user story mock UI,生成满足上述user story的原型界面 根据上述UI,整理出data model(适用于后端和angular的数据模型) 后端CRUD开发,形成REST API,能够返回网站的Index template 前端根据mock,画出app的sitemap(描述URL state转换图) layout index.html,将作为app的index template sitemap转换为angular的routing config…
• 明确产品目标用户,目标市场 • 明确将要开发的产品面世后是要解决什么样的问题 • 梳理产品有哪些功能点,功能点如何按照模块划分 • 站在用户角度思考用户怎样使用这款产品,以故事的情景讲述用户如何使用产品 • 可行性需求讨论,对想到的需求进行分类,看是需求还是伪需求,接着从用户.技术等角度讨论功能的可行性,确定基本功能,核心功能,拓展功能和功能实现顺序:最后讨论功能实现方案. • 团队成员进行开发角色划分,制定开发计划 • 数据流分析,分析产品的数据来源,使用处理功能,加工方式,绘制数据流图.…
关于体温app,比较难的是获取定位信息,剩下的就是增删改查. 设计思路:首先布局一个添加页面,给每个元件添加id,之后在获取地点的EditText获取位置信息,在添加两个布局文件,体现在一个页面里用来记录每天的体温,并且可以修改每日的信息. 源程序代码(底下有链接): MainActivity.java(之前的小程序在判断添加的数据和修改数据的时候有点bug,现已修改) 用于添加数据 package com.example.temperature; import androidx.appcomp…
上一篇记录了利用系统私有变量和方法实现右滑返回手势功能:http://www.cnblogs.com/ALongWay/p/5893515.html 这篇继续记录另一种方案:利用UINavigationController的delegate方法. 核心代理方法有如下两个: - (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigat…
Info.plist文件控制应用的全局配置,例如bundle name,display name. 先来看一下默认创建的Info.plist文件 右键左侧的Info.plist文件,可以open as “property list”或者“source code”来查看.例如下图: 接下来,我将以code方式查看,并添加下列常用配置: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleT…
//单态模式(singletion) #defube DECLEAR_SINGLETION(ClassName) \ private: \ static ClassName* m_pInstance; public: \ static ClassName* GetInstance() \ { \ if ( NULL == m_pInstance ) \ { \ m_pInstance = new ClassName(); } \ return m_pInstance; } \ static vo…
Category使得开发过程中,减少了继承的使用,避免子类层级的膨胀.合理使用,可以在不侵入原类代码的基础上,写出漂亮的扩展内容.我更习惯称之为"分类". Category和Extension类似,都是对原类的扩展,区别是前者需要提供Category的名称,并且不直接支持属性:后者为匿名,多存在于类的实现文件,观感上实现属性.变量.方法的私有效果. 主要记录分类使用过程中常涉及的内容: 1.关联对象的使用 分类虽然不直接支持属性,但是可以利用关联对象的方法,达到属性的正常使用效果. 添…
先记录数据持久化. iOS客户端提供的常用数据持久化方案:NSUserDefaults代表的用户设置,NSKeydArchiver代表的归档,plist文件存储,SQLite数据库(包括上层使用的Core Data,FMDB). 每种方案都有各自的应用场景和范围,不能一概而论.不过可以大致以数据储存量和复杂度来区别. 除了以上提到的方案,再记录一种方案:LevelDB代表的键值对数据库. NSUserDefaults常用方法: 1.可以使用标准用户设置[NSUserDefaults standa…