作者: xiao, yanzi

iOS Button 上文字图片位置的设置

创建一个 UIButton

UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
button.backgroundColor = [UIColor grayColor];
[button setImage:[UIImage imageNamed:IMAGE] forState:UIControlStateNormal];
[button setTitle:TITLE forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, 100, 50);
button.center = self.view.center;
[self.view addSubview:button];

UIButton的默认布局是:title在右,image在左;

%title插图%num

想要修改UIButton的文字位置和图片显示的位置就要借助一个非常重要的属性

typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right; // specify amount to inset (positive) for each of the edges. values can be negative to ‘outset’
} UIEdgeInsets;
表示 上 左 下 右的偏移量;解释下,这四个量的含义:
top : 为正数的时候,是往下偏移,为负数的时候往上偏移;

left : 为正数的时候往右偏移,为负数的时候往左偏移;

bottom : 为正数的时候往上偏移,为负数的时候往下偏移;
right :为正数的时候往左偏移,为负数的时候往右偏移;

实现标题在左 图片在右

CGSize titleSize = button.titleLabel.bounds.size;
CGSize imageSize = button.imageView.bounds.size;
CGFloat interval = 1.0;
button.imageEdgeInsets = UIEdgeInsetsMake(0,titleSize.width + interval, 0, -(titleSize.width + interval));
button.titleEdgeInsets = UIEdgeInsetsMake(0, -(imageSize.width + interval), 0, imageSize.width + interval);

%title插图%num
实际图片在上 文字在下

CGSize titleSize = button.titleLabel.bounds.size;
CGSize imageSize = button.imageView.bounds.size;
CGFloat interval = 1.0;
[button setImageEdgeInsets:UIEdgeInsetsMake(0,0, titleSize.height + interval, -(titleSize.width + interval))];
[button setTitleEdgeInsets:UIEdgeInsetsMake(imageSize.height + interval, -(imageSize.width + interval), 0, 0)];

%title插图%num

Mac 终端命令行启动自带的python和自带的idle

1、启动python
查看Mac自带python的路径:终端输入$ which python

%title插图%num

打开路径在Finder中进入路径 /usr/bin/python

%title插图%num

双击这个exec可执行文件就可以打开python了(也可以直接在终端输入
$ open /usr/bin/python),终端会弹出Python的窗口

2、启动idle
Mac自带的idle的路径跟其自带的python处于同级目录,即 /usr/bin/idle

%title插图%num

跟上面的一样,可以双击/usr/bin/idle路径下的exec可执行文件打开idle,
也可以在终端输入$ open /usr/bin/idle

idle的窗口界面是这样的

%title插图%num

iOS Xcode中的Workspace、Project、Target、Scheme

Project

Xcode中的project是一个包含了所有文件、资源以及构建一个或者多个product所需信息的一个仓库。project包含编译product所用的所有元素,并帮我们组织这些元素之间的关系。一个project可以包含一个或者多个target,target指定了如何编译product。project定义了其内部所有target的默认编译配置(每个target可以通过重新设置(重写)编译配置来定义自己的特殊编译配置)。

project包含了以下信息:

1、对如下源文件的引用:
    (1)代码的.h文件和.m文件
    (2)Libraries 和 frameworks
    (3)Resource files(资源文件,如文本,xml,plist等)
    (4)图片
    (5)Interface Builder files(xib、storyboard等)

2、用来组织资源文件的group(比如哪个文件放在哪个文件夹路径下)

3、project级别的编译配置,比如你对debug、release两种环境的分别设置。

4、targets的配置,这些配置指定了:
    (1)工程编译的引用
    (2)工程编译所需要的资源文件的引用
    (3)工程编译的编译配置,包括对其他target和配置的依赖关系,还包括没有target重写(覆盖)的project级别的编译配置

5、用于debug和测试程序的执行环境,这些执行环境指定了:
    (1)xcode在run或debug时的可执行文件
    (2)传递给可执行文件的命令行参数(若有)
    (3)程序运行时设置的环境变量(若有)

 

一个project可以独立存在,也可以包含在一个workspace下。
你可以用Xcode schemes来指定当前的target、编译配置、可执行文件配置。

Target

target指定了要编译的product, 并包含’用project 或 workspace里中的一系列文件来编译一个product的说明‘。一个target只能定义一个product,target将输入(包括编译product所需的源文件和处理这些源文件的说明)组织到构建系统中。一个project可以包含一个或多个target,每个target可以对应产生一个product。

上面的编译一个product的说明的表现形式就是我们xcode里的build settings和 build phases。

一个target和由它产生的product可以关联其他的target。如果一个target的编译依赖于另外一个target的输出,我们就说前者依赖于后者;如果这两个target在同一个workspace中,Xcode就能识别这个依赖;这种依赖关系我们称之为隐式依赖(implicit dependency)。你也可以在build settings明确指定target依赖关系,也可以将Xcode中的隐式依赖指定为无依赖关系,比如,你可以同时编译处于同一workspace中的library和链接这个library的application,Xcode会识别library和application的关系,然后先编译library,但是如果你的本意是想要链接这个library的version而不是library本身,你可以在build settings中创建一个显式的依赖来覆盖这个隐式依赖。

Workspace

workspace是一种xcode文件,用于分组projects和其他文件,便于我们使用它们。workspace可以包含多个project和其他你想要引入的文件。除了组织各个project中所有的文件之外,workspace还提供存在于projects和它们对应targets之间的隐式和显式关系。

一个project可以属于多个workspace。

默认情况下,workspace中的projects编译在同一目录下,我们称之为workspace build directory,每个workspace都有各自的编译目录。因为同一workspace下的每个project中的所有文件都在同一编译目录下,所以这些文件彼此之间是相互可以引用的。因此,如果workspace中的多个projects使用了相同的libraries的时候,我们就不需要给每个工程都拷贝一个。

workspace中每个project依然都是独立的。如果你想单独的使用这个project,并且不希望影响其他project,或者被其他project影响,你可以直接打开这个project而不是通过workspace,或者你也可将这个project添加到其他workspace中。一个project可以同时从属于多个workspace,所以你可以在任意的组合中使用这个project,而不需要去重新配置project或者workspace。

你可以使用workspace中默认的编译目录,也可以自己指定一个。注意,如果你为一个project指定了一个编译目录,那么当你编译这个project时,这个目录会被此project所属的任何workspace的编译目录所覆盖。

Scheme

scheme定义了可以用于编译若干target,以及编译这些target时的一些配置和要执行的测试。我们可以定义多个scheme,但是每次只能使用其中一个。我们可以设置scheme保存在project中还是workspace中。如果保存在project中,那么任意包含了这个project的workspace都可以使用。如果保存在workspace中,那么只有这个workspace可以使用。选择了scheme就意味着选择了运行目标。

Mac上使用Source Tree的一些总结

作为一名Max/Xcode/iOS的初学者,学习仅有3个月时间,很多东西还不是很懂。在公司做项目集成代码用的是svn,在*开始听了一位同事说使用versions来进行svn访问,但是versions并不是一个免费的软件,于是上网下载几个破解版才搞好,终于能访问到svn了。但是随着自己的使用,发现了一些坑爹的问题,如今这个破解版versions,总是在不经意间就奔溃了,都快要玩哭我了。于是昨天,想起了一位大神说Source Tree都可以使用svn,于是想自己动手弄一个,毕竟Source Tree是免费软件。

在App Store中下载了Source Tree,安装完成后弹出了一个页面被告知现在Source Tree已经不在App Store更新了(由于没有细看,只是想起那位大神也说过类似的话,就就想想自己理解应该没错),于是从昨晚开始打开sourcetreeapp.com,打开啊打开,总是load不出来,发现网络妥妥把我压制了。*后只能边下载新版本边使用旧版本了。

好了,在使用Source Tree过程中,使用Gitbub是能正常使用的,可是一旦连接svn服务器,就出现错误了,上网找了找,再结合错误信息,初步认为是系统的Perl和Source Tree的svn中Perl没有进行必要的链接,Source Tree查找不到svn相关信息。我的系统中只有Xcode中自装的Perl版本有5.12和5.16,可是这个App Store中下载的Source Tree版本只是1.5.6,里面包含的Perl版本*高只有5.12,这样和错误不符,错误显示的是Perl5.16版本错误,于是只能等待*新Source Tree版本下载完成再作尝试(可是还是网络压制呀~~)。

历尽千辛万苦,终于把40+M的Source Tree dmg文件下下来了,进行安装。在不进行任何设置的情况下使用svn资源库,的确还是

Can’t locate SVN/Core.pm in @INC (@INC contains: /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/5.16.2/darwin-thread-multi-2level /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/5.16.2 /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2level /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.2 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/Git/SVN/Utils.pm line 6.
BEGIN failed–compilation aborted at /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/Git/SVN/Utils.pm line 6.
Compilation failed in require at /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/Git/SVN.pm line 26.
BEGIN failed–compilation aborted at /usr/local/Cellar/git/1.8.4.1/lib/perl5/site_perl/Git/SVN.pm line 33.
Compilation failed in require at /usr/local/Cellar/git/1.8.4.1/libexec/git-core/git-svn line 25.
BEGIN failed–compilation aborted at /usr/local/Cellar/git/1.8.4.1/libexec/git-core/git-svn line 25.
果然还是因为Perl 5.16版本没有进行链接的问题,于是把之前上网查找到的方法进行了一番设置,再次使用svn。诶,行了。

而设置很简单,就只是建立两个文件夹间的软链接即可:

1. ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.16/darwin-thread-multi-2level/SVN /Applications/SourceTree.app/Contents/Resources/git_local/lib/perl5/site_perl/5.16.2/darwin-thread-multi-2level/

2. ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.16/darwin-thread-multi-2level/auto/SVN /Applications/SourceTree.app/Contents/Resources/git_local/lib/perl5/site_perl/5.16.2/darwin-thread-multi-2level/auto/

OK,现在正在从svn服务器导到本地,希望能成功啦。貌似这个资源库很大,要很久的样子。

好吧,还是待它导完再更新了~~

第二日

昨晚忘记更新了,昨晚经过长时间导到本地,终于成功了,随后测试了git的基本功能,能上传代码到github了。至此,Source Tree的安装总结就到一段落了。

以此记录自己的一次经历,望学习交流。

iOS--字符编码,NSString和UTF-8间的转换

ASCII码相信很熟悉了,只是自己一直都记不住基本规律,有时候用起来十分不爽。

ASCII,共7位,表示128个字符,一般都在前面加0补全8位形成一个Bit。0~31以及127为控制字符,不能打印;32为空格;48(HEX: 0x30)为0;65(HEX: 0x41)为A;97(HEX: 0x61)为a。

GB2312:ANSI编码中的一种,对ASNI编码*初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉子字符集国家标准编码,统称为GB码,或国标码。其中*有影响的是于1980年发布的《信息交换用汉字编码字符集 基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常被通称为国标码。GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。GB2312编码用两个字节表示一个汉字,所以理论上*多可以表示256×256=65536个汉字。(摘自百度百科)

GBK:汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。GBK兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位。(摘自百度百科)

Unicode:把世界上所有的符号都纳入其中,包括英文、日本、中文等等,现在能容纳100多万个符号。这样效率上就不好,于是UTF-8出现了,它可以根据不同的符号自动选择编码的长短。

iOS中对字符串进行UTF-8编码:输出str字符串的UTF-8格式

[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

解码:把str字符串以UTF-8规则进行解码

[str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iOS--坐标变换Quartz 2D中的CGContextTranslateCTM、CGContextScaleCTM、CGContextRotateCTM、CGContextConcatCTM等

iOS讲义总结

在iOS中,Quartz 2D提供了坐标变换支持。

一、特殊的坐标变换(平移、缩放、旋转)

1. – void CGContextTranslateCTM ( CGContextRef c, CGFloat tx, CGFloat ty ):平移坐标系统。

该方法相当于把原来位于 (0, 0) 位置的坐标原点平移到 (tx, ty) 点。在平移后的坐标系统上绘制图形时,所有坐标点的 X 坐标都相当于增加了 tx,所有点的 Y 坐标都相当于增加了 ty。

2. – void CGContextScaleCTM ( CGContextRef c, CGFloat sx, CGFloat sy ):缩放坐标系统。

该方法控制坐标系统水平方向上缩放 sx,垂直方向上缩放 sy。在缩放后的坐标系统上绘制图形时,所有点的 X 坐标都相当于乘以 sx 因子,所有点的 Y 坐标都相当于乘以 sy 因子。

3. – void CGContextRotateCTM ( CGContextRef c, CGFloat angle ):旋转坐标系统。

该方法控制坐标系统旋转 angle 弧度。在缩放后的坐标系统上绘制图形时,所有坐标点的 X、Y 坐标都相当于旋转了 angle弧度之后的坐标。

为了让开发者在进行坐标变换时无须计算多次坐标变换后的累加结果,Quartz 2D还提供了如下两个方法来保存、恢复绘图状态。

– void CGContextSaveGState ( CGContextRef c ):保存当前的绘图状态。

– void CGContextRestoreGState ( CGContextRef c ):恢复之前保存的绘图状态。

需要说明的是,CGContextSaveGState() 函数保存的绘图状态,不仅包括当前坐标系统的状态,也包括当前设置的填充风格、线条风格、阴影风格等各种绘图状态。但 CGContextSaveGState() 函数不会保存当前绘制的图形。

二、通用的坐标变换(通过变换矩阵进行变换)

除了以上3个坐标转换方法之外,Quartz 2D提供更通用的坐标转换方法。

void CGContextConcatCTM ( CGContextRef c, CGAffineTransform transform ):使用 transform 变换矩阵对 CGContextRef 的坐标系统执行变换,通过使用坐标矩阵可以对坐标系统执行任意变换。

CGAffineTransform CGContextGetCTM ( CGContextRef c ):获取CGContextRef的坐标系统的变换矩阵。

上述两个方法中都涉及一个关于矩阵的API:CGAffineTransform。

创建CGAffineTransform的4种方式:

1. CGAffineTransform CGAffineTransformMakeTranslation ( CGFloat tx, CGFloat ty ):创建进行位移变换的变换矩阵。该函数的两个参数与前面介绍的位移变换的两个参数的作用相同。

2. CGAffineTransform CGAffineTransformMakeScale ( CGFloat sx, CGFloat sy ):创建进行缩放变换的变换矩阵。该函数的两个参数与前面介绍的缩放变换的两个参数的作用相同。

3. CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle ):创建进行旋转变换的变换矩阵。该函数的参数与前面介绍的旋转变换的参数的作用相同。

4. CGAffineTransform CGAffineTransformMake ( CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty ):该函数使用自定义变换矩阵执行变换。

其中 ( a, b, c, d )会形成变换矩阵,tx、ty为横向和纵向的位移,变换后结果应该为:

a, b

(x, y) x (c, d) + (tx, ty) = (xa x yc, xb x yd) + (tx, ty) = (xa x yc + , xb x yd + ty)。

一般坐标变换矩阵

1)水平镜像(绕 Y 轴做对称变化):CGAffineTransformMake ( -1, 0, 0, 1, 0, 0 )

-1, 0

0, 1

2) 垂直镜像(绕 X 轴做对称变化):CGAffineTransformMake ( 1, 0, 0, -1, 0, 0 )

1, 0

0, -1

3)绕 x=y轴做对称变化:CGAffineTransformMake ( 0, 1, 1, 0, 0, 0 )

0, 1

1, 0

4)绕x =-y轴做对称变化:CGAffineTransformMake ( 0, -1, -1, 0, 0, 0 )

0, -1

-1, 0

5)做“水平倾斜”的变换,此时 Y 坐标无须变换,只要将 X 坐标增加 tan( angle ) x X 即可(angle 代表顺时针转过的角度):CGAffineTransformMake ( 1, 0, tan(angle), 1, 0, 0 )

1, 0

tan(angle), 1

6)做“垂直倾斜”的变换,此时 X 坐标无须变换,只要将 Y 坐标减少 tan( angle ) x X 即可:CGAffineTransformMake ( 1, -tan(angle), 0, 1 )

1, -tan(angle)

0, 1

三、复合矩阵坐标变换

1. CGAffineTransform CGAffineTransformTranslate ( CGAffineTransform t, CGFloat tx, CGFloat, ty ):对已有的变换矩阵 t 额外增加位移变换。

2. CGAffineTransform CGAffineTransformScale ( CGAffineTransform t, CGFloat sx, CGFloat sy ):对已有的变换矩阵 t 额外增加缩放变换。

3. CGAffineTransform CGAffineTransformRotate ( CGAffineTransform t, CGFloat angle ):对已有的变换矩阵 t 额外增加旋转变换。

4. CGAffineTransform CGAffineTransformInvert ( CGAffineTransform t ):对已有的变换矩阵 t 进行反转。

5. CGAffineTransform CGAffineTransformConcat ( CGAffineTransform t1, CGAffineTransform t2 ):将两个变换矩阵进行叠加。

四、对CGPoint、CGSize和CGRect进行坐标变换

1. CGPoint CGPointApplyAffineTransform ( CGPoint point, CGAffineTransform t ):对指定的CGPoint执行变换,函数返回坐标变换后的CGPoint。

2. CGSize CGSizeApplyAffineTransform ( CGSize size, CGAffineTransform t ):对指定的CGSize执行变换,函数返回坐标变换后的CGSize。

3. CGRect CGRectApplyAffineTransform ( CGRect rect, CGAffineTransform t ):对指定的CGRect执行变换,函数返回坐标变换后的CGRect。

五、对UIView进行坐标变换

UIView提供了一个transform属性,该属性支持设置CGAffineTransform变换矩阵,这样就可对UIView控件本身进行坐标变换,从而改变UIView控件本身的外观。

Mac--快捷键

1. 退出应用
command + q

2. 全屏截图,默认保存路径为桌面
shift + command + 3

3. 自定义区域截图,默认保存路径为桌面
shift + command + 4

4. 新建应用窗口
command + n

5. 滚动到头部
command + 上方向键

6. 滚动到底部
command + 下方向键

7. 浏览器--关闭标签页
command + w

8. xcode--运行(run)项目
command + r

9. xcode--编译(build)项目
command + b

10. xcode--clean项目
shift + command + k

iOS--UILabel字体默认宽度和高度

今天发现了UILabel的一个属性:intrinsicContentSize,这个属性能返回UILabel对象的内容宽高(1行文本)。

宽度
接着发现UILabel对象的文字宽度是由文字的font属性和文字个数确定的,而且中文、英文、数字的宽度计算还不一样,我认为的一个原因是iOS默认的字体中,中文是等宽字体,而英文和数字并不是等宽字体。

中文
由于等宽,所以很好计算,包括全月角标点符号也是可以这么计算的,就是:每个中文文字的宽度 * 文字个数。文字个数就很好确定了,但每个中文文字的宽度是怎样确定的呢。通过一个小测试可知,中文文字的宽度是由UILabel的font属性确定的,font属性设置了多大号的字体,中文问题宽度就为多大号,即两者呈线性关系(PS:这个关系的前提是使用系统默认的字体。此外,若没有显式设置font属性的话,UILabel默认的字体大小为17),如:

label.font = [UIFont systemFontOfSize:12]; // 每个中文字宽度就为12
label.font = [UIFont systemFontOfSize:17]; // 系统默认字体大小,每个中文文字宽度为17
label.font = [UIFont systemFontOfSize:20]; // 每个中文文字宽度为20

数字
数字在系统默认字体内就不是等宽的了,所以宽度也会随着数字的不同而不同,下面是字体大小为系统默认字体大小(即17)的数字宽度表:
%title插图%num

  • 英文
    英文在系统默认字体中也是不等宽的,所以宽度也是会随着字母的不同而不同,下面是字体大小为系统默认字体大小(即17)的数字宽度表:%title插图%num%title插图%num%title插图%num

    高度

    UILabel的高度就貌似没有线性关系了:

    %title插图%num%title插图%num%title插图%num

iOS--xcodebuild命令记录

描述
build Xcode projects and workspace

xcodebuild可以编译打包Xcode项目内的一个或多个targets,或Xcode工作区或项目内的一个scheme。

要编译打包Xcode项目,需要在项目目录下执行xcodebuild命令(如目录包含name.xcodeproj文件)。如果目录下有多个项目文件,则需要使用“-project”来指定需要编译打包的项目。xcodebuild编译打包命令默认使用基本编译配置来编译项目内列出的*个target。

编译打包Xcode workspace,必须设置“-workspace”和“-scheme”参数来定义编译信息

xcodebuild [-project name.xcodeproj] [[-target targetname] … | alltargets] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

xcodebuild [-workspace name.xcworkspace] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

xcodebuild -version [-sdk [sdkfullpath | sdkname]] [infoitem]

xcodebuild -showsdks

xcodebuild -showBuildSettings [-project name.xcodeproj | [-workspace name.xcodespace -scheme schemename]]

xcodebuild -list [-project name.xcodeproj | -workspace name.xcodespace]

xcodebuild -exportArchive -archivePath xcarchivepath -exportPath destinationpath -exportOptionPlist path

xcodebuild -erportLocalizations -project name.xcodeproj -localizationPath path [[-exportLanguage language] …]

xcodebuild -importLocalizations -project name.xcodeproj -localizationPath path

Options
1. -project name.xcodeproj
编译项目name.xcodeproj。如果目录中有多个项目文件,则此参数必须。

2. -target targetname
编译项目中指定的target。

3. -alltarget
编译项目中所有target

4. -workspace name.xcodespace
编译项目name.xcodespace

5. -scheme schemename
编译项目指定scheme的项目。如果是编译workspace的话,此参数必须。

6. -destination destinationspecifier
使用destinationspecifier来指定特定的目标设备。默认选择的是和对应scheme兼容的目标设备。

7. -destination-timeout timeout
找寻指定目标设备信息的超时时间,默认为30s。

8. -configuration configurationname
编译每个target时指定的configuration

9. -arch architerture
编译每个target时指定的architecture(系统架构)

10. -sdk [sdkfullpath | sdkname]
编译项目(project)或工作区(workspace)是所使用的SDK版本。参数为SDK的*对路径或SDK的名称。

11. -showsdks
列出Xcode识别的可用的SDK信息,其中包含可用在“-sdk”命令中规范的SDK名称。此命令不会执行build命令。

12. -showBuildSettings
列出一个项目(project)或者(一个工作区(workspace)和scheme)中的编译设置信息。此命令不会执行build命令。后面可跟参数“-project”或(“-workspace”和“-scheme”)

13. -list
列出一个项目(project)或一个工作区(workspace)中scheme的target和configuration信息。此命令不会执行build命令。后面可跟参数“-project”或“-workspace”

14. -enableAddressSanitizer [YES | NO]
15. -enableCodeCoverage [YES | NO]
16. -derivedDataPath path
17. -resultBundlePath path
18. -exportArchive
19. -archivePath xcarchivepath
20. -exportPath destinationpath
21. -exportOptionsPlist path
22. -exportLocalizations
23. -importLocalizations
24. -localizationPath
25. -exportLanuage language
26. action …

Specify
build
analyze
archive
test
installsrc
install
clean

27. -xcodefig filename
28. -dry-run -n
29. -skipUnavailableActions
30. buildsetting=value
31. -userdefault=value
32. -tooolchain [identifier | name]
33. -verbose
详情模式

34. -version
35. -license
36. -usage
37. Destinations

OS X
iOS
iOS Simulator
watchOS
tvOS
tvOS Simulator

38. Exporting Archives
39. Environment Variavles
40. Exit Codes
Example
xcodebuild clean install
清除build文件夹的内容,接着编译及安装Xcode项目中*个target。
xcodebuild -project MyProject.xcodeproj -target Target1 -target Target2 -configuration Debug
编译项目MyProject.xcodeproj中的target1和target2,编译过程是Debug模式。
xcodebuild -target My

iOS--项目目录组织及生成脚本

在iOS应用开发,Xcode项目目录是随意组织的,这样一来,就会导致不同的人就会有不同的组织方式。从这一点来看,Xcode的项目组织形式上个人觉得就没有Android开发(无论是eclipse还是as)项目组织形式好了。

这段时间为了规范自己的编码目录组织形式,参考网上的资料,结合自己的习惯,定下了以下的一个iOS项目目录组织结构。这个结构并不完美,有好的想法和好的思路会继续更新,逐渐完善整个结构。

资源下载:iOS项目框架脚本

一、目录结构
.
| _ Expand (扩展内容)
| _ _ Category (自定义Category)
| _ _ Macros (宏定义)
| _ _ _ _ JHMacros.h (项目宏定义)
| _ _ _ _ JHMacros.h (全局默认宏定义)
| _ _ _ _ JHThirdMacros.h (项目第三方宏定义)
| _ _ Tool (工具类)
| _ Main (主逻辑及界面View)
| _ _ Module1 (模块1)
| _ _ _ _ Controller (控制器)
| _ _ _ _ Model (数据模型)
| _ _ _ _ Other (其他文件)
| _ _ _ _ Protocal (协议)
| _ _ _ _ Service (服务逻辑)
| _ _ _ _ View (自定义View视图)
| _ _ _ _ _ _ Cell (Cell视图)
| _ _ _ _ _ _ SubView (子视图)
| _ _ Module2 (模块2)
| _ _ _ _ Controller
| _ _ _ _ Model
| _ _ _ _ Other
| _ _ _ _ Protocal
| _ _ _ _ Service
| _ _ _ _ View
| _ _ _ _ _ _ Cell
| _ _ _ _ _ _ SubView
| _ _ Public (公共内容)
| _ _ _ _ Controller
| _ _ _ _ Model
| _ _ _ _ Other
| _ _ _ _ Protocal
| _ _ _ _ Service
| _ _ _ _ View
| _ _ _ _ _ _ Cell
| _ _ _ _ _ _ SubView
| _ Resource (资源)
| _ _ Font (字体资源)
| _ _ Image (图片资源)
| _ _ _ _ Module1.xcassets (模块1图片资源)
| _ _ _ _ Module2.xcassets (模块2图片资源)
| _ _ _ _ Public.xcassets (公共资源)
| _ _ Plist (Plist文件)
| _ SDKFile (第三方SDK)
| _ Vendor (开源项目代码)

二、生成脚本说明
本生成脚本共包含2个文件,一个是项目信息配置文件,一个是脚本程序。

1. 项目信息配置文件(JHFrameworkInitialization.plist)
项目信息配置文件为一个plist文件,包含两个key:projectName和Modules,分别指定项目的项目名称及项目的模块数组。项目名称*好是首字母大写并符合驼峰命名法原则,Modules是一个数组,若项目不能明显区分模块,则不需填写。 该文件需和脚本程序文件在同一目录,否则会出现找不到配置文件的错误。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>ProjectName</key>
<string>OMGProject</string>
<key>Modules</key>
<array>
<string>Module1</string>
<string>Module2</string>
</array>
</dict>
</plist>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2. 脚本程序(JHFrameworkInitialization.sh)
其实这个脚本程序是很好理解的,只要有上述的项目目录组织结构,接着就基本使用mkdir命令来生成对应的文件即可。生成完成后需手动把整个结构文件夹添加

#!/bin/sh

echo “”
echo “————————————-”
echo “- 初始化JH iOS框架 -”
echo “————————————-”

echo “”
echo “将在以下目录新建:”
echo $PWD
echo “”

# 通过Plist文件获取当前配置数据
infoPlistFilePath=”JHFrameworkInitialization.plist”
if [[ -f infoPlistFilePath ]]; then
echo “找不到项目信息配置文件(JHFrameworkInitialization.plist)”
return
fi
projectName=$(/usr/libexec/PlistBuddy -c “print ProjectName” ${infoPlistFilePath})
modules=$(/usr/libexec/PlistBuddy -c “print Modules” ${infoPlistFilePath})

# 判断是否存在JH iOS框架文件
JHPath=”JHFramework”
if [ -a “$JHPath” ]; then
rm -rf $JHPath
fi
mkdir $JHPath

# 创建Main文件夹
echo “1.创建Main文件夹…”
mkdir $JHPath”/Main”
mkdir $JHPath”/Main/Public”
mkdir $JHPath”/Main/Public/Controller”
mkdir $JHPath”/Main/Public/View”
mkdir $JHPath”/Main/Public/View/Cell”
mkdir $JHPath”/Main/Public/View/SubView”
mkdir $JHPath”/Main/Public/Model”
mkdir $JHPath”/Main/Public/Other”
mkdir $JHPath”/Main/Public/Protocal”
mkdir $JHPath”/Main/Public/Service”
# mkdir $JHPath”/Main/Preview”
# mkdir $JHPath”/Main/Base”
echo ” Main文件夹创建成功!”

# 创建Expand文件夹
echo “2.创建Expand文件夹…”
mkdir $JHPath”/Expand”
mkdir $JHPath”/Expand/Category”
mkdir $JHPath”/Expand/Macros”
mkdir $JHPath”/Expand/Tool”
echo ” Expand文件夹创建成功!”

# 创建Resource文件夹
echo “3.创建Resource文件夹…”
mkdir $JHPath”/Resource”
mkdir $JHPath”/Resource/Font”
mkdir $JHPath”/Resource/Image”
mkdir $JHPath”/Resource/Image/Public.xcassets”
# mkdir $JHPath”/Resource/Global”
mkdir $JHPath”/Resource/Plist”
echo ” Resource文件夹创建成功!”

# 创建SDKFile文件夹
echo “4.创建SDKFile文件夹…”
mkdir $JHPath”/SDKFile”
echo ” SDKFile文件夹创建成功!”

# 创建模块文件夹
echo “5.创建Vendor文件夹…”
mkdir $JHPath”/Vendor”
echo ” Vendor文件夹创建成功!”

# 初始化JHMacros.h
echo “6.创建JHMacros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JHMacros.h” # JHMacros.h位置
echo “//” >>$macrosPath
echo “// JH常用宏定义(尽量不要在这里增加项目的宏定义)” >>$macrosPath
echo “// JHMacros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JHMacros_h” >>$macrosPath
echo “#define JHMacros_h” >>$macrosPath
echo “” >>$macrosPath
echo “// 导入必要的头文件” >>$macrosPath
echo “#import \”JHThridMacros.h\”” >>$macrosPath
echo “#import \”JH”$projectName”Macros.h\”” >>$macrosPath
echo “” >>$macrosPath
echo “// 设备Size常量” >>$macrosPath
echo “#define JH_SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width // 屏幕宽度” >>$macrosPath
echo “#define JH_SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height // 屏幕高度” >>$macrosPath
echo “#define JH_TABBAR_HEIGHT 49.0 // TabBar高度” >>$macrosPath
echo “#define JH_STATUSBAR_HEIGHT 20.0 // 状态栏高度([[UIApplication sharedApplication] statusBarFrame].size.height)” >>$macrosPath
echo “#define JH_NAVIGATIONBAR_HEIGHT 44.0 // NavigationBar高度” >>$macrosPath
echo “” >>$macrosPath
echo “// 设备信息常量” >>$macrosPath
echo “#define JH_SYSTEM_NAME [UIDevice currentDevice].systemName // 设备系统名称” >>$macrosPath
echo “#define JH_SYSTEM_VERSION [UIDevice currentDevice].systemVersion // 设备系统版本” >>$macrosPath
echo “#define JH_UUID [[UIDevice currentDevice].identifierForVendor UUIDString] // UUID,每次安装app都会不一样” >>$macrosPath
echo “” >>$macrosPath
echo “// NSUserDefaults” >>$macrosPath
echo “#define JH_USERDEFAULTS [NSUserDefaults standardUserDefaults]” >>$macrosPath
echo “” >>$macrosPath
echo “// 关于文件管理的常量” >>$macrosPath
echo “#define JH_FILE_MANAGER [NSFileManager defaultManager] // 文件管理者” >>$macrosPath
echo “#define JH_SANDBOX_DOCUMENTS_PATH [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] // sandbox中documents文件夹路径” >>$macrosPath
echo “#define JH_SANDBOX_LOG_DERECTORY [JH_SANDBOX_DOCUMENTS_PATH stringByAppendingPathComponent:@”JHLog”] // 日志缓存路径” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JHMacros_h */” >>$macrosPath
echo ” JHMacros.h文件创建成功”

# 初始化JHThirdMacros.h
echo “7.创建JHThirdMacros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JHThirdMacros.h” # JHThirdMacros.h位置
echo “//” >>$macrosPath
echo “// JH第三方SDK宏定义” >>$macrosPath
echo “// JHThridMacros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JHThridMacros_h” >>$macrosPath
echo “#define JHThridMacros_h” >>$macrosPath
echo “” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JHThridMacros_h */” >>$macrosPath
echo ” JHThirdMacros.h文件创建成功”

# 初始化应用<ProjectName>Macros.h
if [[ $projectName != “” ]]; then
echo “8.创建JH”$projectName”Macros.h文件…”
macrosPath=$JHPath”/Expand/Macros/JH”$projectName”Macros.h” # JH<ProjectName>Macros.h位置
echo “//” >>$macrosPath
echo “// 本应用(”$projectName”)宏定义” >>$macrosPath
echo “// JH”$projectName”Macros.h” >>$macrosPath
echo “// “$projectName >>$macrosPath
echo “//” >>$macrosPath
echo “// Created by JH on $(date +%m/%d/%y).” >>$macrosPath
echo “// Copyright © 2016 JH. All rights reserved.” >>$macrosPath
echo “//” >>$macrosPath
echo “” >>$macrosPath
echo “#ifndef JH”$projectName”Macros_h” >>$macrosPath
echo “#define JH”$projectName”Macros_h” >>$macrosPath
echo “” >>$macrosPath
echo “” >>$macrosPath
echo “#endif /* JH”$projectName”Macros_h */” >>$macrosPath
echo ” JH”$projectName”Macros.h文件创建成功”
fi

# 创建模块文件夹
echo “9.创建模块文件夹…”
for module in $modules
do
if [[ ${module} != “Array” && ${module} != “{” && ${module} != “}” ]]; then
mkdir $JHPath”/Main/”$module
mkdir $JHPath”/Main/”$module”/Controller”
mkdir $JHPath”/Main/”$module”/View”
mkdir $JHPath”/Main/”$module”/View/Cell”
mkdir $JHPath”/Main/”$module”/View/SubView”
mkdir $JHPath”/Main/”$module”/Model”
mkdir $JHPath”/Main/”$module”/Other”
mkdir $JHPath”/Main/”$module”/Protocal”
mkdir $JHPath”/Main/”$module”/Service”
mkdir $JHPath”/Resource/Image/”$module.xcassets
fi
done
echo ” 模块文件夹创建成功!”

echo “”
echo “————————————-”
echo “- 初始化JH iOS框架完成 -”
echo “————————————-”
echo “”

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速