小站会根据您的关注,为您发现更多,

看到喜欢的小站就马上关注吧!

下一站,你会遇见谁的梦想?

小站头像

爱佳软

时间比你想象的要少,而你需要的比你知道的要多

RSS 归档

站长

26人关注

站长在关注

2014 / . 04 / . 07

Ry的Objective-C教程 -- 引言

引言

Objective-C是苹果的 iOS 和 OS X 操作系统的原生编程语言。它是编译型的,通用的语言,能够构建从命令行工具到动画图形用户界面再到特定领域的库。它也提供许多工具来维护大型,可扩展的框架。

        Ry的Objective-C教程 -- 引言

Objective-C写的各种程序

类似C++,Objective-C被设计成添加了面向对象特性的C语言,但是两种语言采用根本不同的理念做到了这一点。Objective-C明显的更动态,推迟大多数决定到运行时而不是编译时。这一点体现在iOS和OS X开发下的许多设计模式中。

Objective-C同样因它冗长的命名约定而出名。结果是代码描述性很强以至于它实际上不可能被误解或者误用。例如,下面的片段展示了一个C++方法调用Objective-C的等价方法。

// C++

john->drive("Corvette", "Mary's House")

// Objective-C

[john driveCar:@"Corvette"toDestination:@"Mary's House"]

正如你所看到的,Objective-C更像是人类语言而不是计算机语言。一旦你习惯使用它,在新项目中它会变的非常容易让你适应,并且使用第三方代码。如果你对方括号有点犯怵,不要担心。在教程结束时你会舒服的使用它们。

本教程通过Balsamiq Mockups工具制作。这个快速线框工具使得设计应用像画画一样容易。

框架

和大多数编程语言一样,Objective-C 由广泛的标准库支持,并且语法比较简单。本教程主要专注于语言本身,但是它有助于你对于与现实世界交互的工具有一点想法。

苹果的框架和”标准库”中会有几处不同,但是苹果的Cocoa 和 Cocoa Touch 框架目前是最流行的。这些框架分别定义了OS X和iOS应用构建的API。下表重点介绍了一些Cocoa和Cocoa Touch中的关键框架。如需更详细的讨论,请访问 Mac Technology Overview 或 iOS Technology Overview

框架

描述

Foundation

定义了核心对象数据类型像字符串,数组,字典等。我们将在Data Types 单元中探索这一框架的重要部分。

UIKit

提供了几十种创建和控制iOS设备上用户界面的类。

AppKit

和UIKit作用一样, 但是针对于 OS X 设备。

CoreData

为管理对象关系提供了方便的API,支持撤销、恢复功能,并且与持久性存储相互沟通。

MediaPlayer

定义了用于播放音乐,展示视频和访问用户的iTunes资料库的高级API。

AVFoundation

提供了播放,录音和集成音频 / 视频到自定义应用程序中的低级别支持。

QuartzCore

包含两个图像处理的子框架。CoreAnimationframework能让你的UI控件动起来,CoreImage 提供图像和视频处理功能(如滤镜)。

CoreGraphics

提供低级别的2D绘图支持。处理基于路径的绘制,变换,图像的创建,等等。

在你适应Objective-C之后,这些框架会被你用来构建 iOS 和 OS X 应用程序。但再次声明,本教程并不是全面的应用开发指南—它的目的是让你能使用上面的框架。除了基础的框架,教程中我们实际上不会接触任何框架。

Xcode

Xcode是开发Mac,iPhone和iPad应用的苹果集成开发环境。它不仅仅包含代码编辑器,还包含界面生成器,设备模拟器,一个全面的用于测试和调试的套件,之前讨论中的框架,还有你做应用需要的一切。

虽然有其他方法来编译Objective-C代码,但Xcode绝对最容易。我们强烈推荐你现在安装Xcode以便你能学习本教程接下来的例子。它可以通过Mac App Store免费下载。

创建一个应用程序

Xcode提供多种 iOS 和 OS X 应用的模版。所有模版都可以通过导航到File > New > Project...或者使用Cmd+Shift+N快捷键找到。之后会打开一个对话窗口,让你选择一个模板:

Ry的Objective-C教程 -- 引言

创建一个命令行应用程序

在本教程中,我们将使用上面截图中 OS X > Application下高亮的Command Line Tool 模版。这会让我们揭穿iOS/OS X特有的元素并且聚焦在Objective-C语言本身。现在就去创建一个命令行工具吧。这会打开另一个对话框要求你配置项目:

Ry的Objective-C教程 -- 引言

配置一个命令行应用程序

你可以任意填写Product Name 和Organization Name fields。在Company Identifier中填写edu.self,但这显然是个人使用的标识符。对于上线的应用产品,你需要在苹果公司注册成为开发者来获取一个真实的公司ID。

本教程利用的许多类在Foundation Framework中定义,所以确定在Type这一项中选择Foundation。最后,新项目中应该总是选中Use Automatic Reference Counting(使用自动引用计数)复选框。

单击下一步,会提示你输入保存项目的目录(保存在你喜欢的任意地方),然后你应该有一个全新的Xcode项目来一起玩。在Xcode IDE的左侧栏中,你会发现一个名为main.m的文件(连同其他一些文件和文件夹)。现在,这个文件包括应用的全部内容。注意.m扩展名专用于Objective-C源文件。

Ry的Objective-C教程 -- 引言

在项目导航中的main.m

要编译这个项目,单击IDE左上角的运行按钮或者使用Cmd+R快捷键。这时在IDE底部的输出面板应该显示"Hello,World"。

Ry的Objective-C教程 -- 引言

Xcode的输出面板

main()函数

和以前的C程序一样简单,main函数是Objective-C程序的入口函数。大多数Xcode内置的模版中会创建一个叫做main.m的文件,其中定义了默认的main()函数。选中Xcode项目导航面板中的main.m文件将会打开编辑窗口并显示下面内容。

#import<Foundation/Foundation.h> 

intmain(int argc, constchar* argv[]) {    

@autoreleasepool {

         // insert code here...

         NSLog(@"Hello, World!");

     }

     return0;

}

你可以在 @autoreleasepool代码块中写代码并尝试本教程中的代码片段。上面的main()函数只是简单的调用了Foundation Framework中定义的NSLog()全局函数。这是Objective-C中用于输出信息到控制台的通用工具。还要注意的是Objective-C中字符串前面总要用(@)修饰。

在本教程中我们会直接编辑main.m文件来看看新语言是如何工作的,但在实际工作中,你可能永远不用修改模版中的main()函数。对于大多数应用,main()函数唯一需要做的是把“application delegate”的控制权交给应用程序。例如像下面iOS项目中的main()函数。

#import<UIKit/UIKit.h> 

#import"AppDelegate.h" 

intmain(int argc, char*argv[]) {

@autoreleasepool {

    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

但是既然我们要坚持使用命令行工具,上面有点超出了本教程讨论的范围。

做好准备!

接下来的两个单元会探索基本的C语法。之后,我们会专心于类,方法,协议和其他面向对象的结构。本教程充满了动手的实例,并且我们鼓励你把它们粘贴到刚刚创建的临时项目中,并弄乱一些参数看看发生了什么。

2014 / . 04 / . 04

zsh上使用增量补全命令的插件

很久以前的插件了,不过对于记性不好的我很有用,记录下安装过程

1.下载 http://mimosa-pudica.net/zsh-incremental.html incr-*.zsh

2.把incr-0.2.zsh放到任意目录(我放在了/User/d目录下也就是~下)

3.编辑~/.zshrc,添加source ~/incr*.zsh

zsh上使用增量补全命令的插件

2014 / . 03 / . 31

减少更新iOS应用的下载大小

iOS 6开始,AppStore将会对所有提交到商店的新版本应用自动创建一个更新包。当创建更新包时,AppStore会把您的应用的先前一个或者更多的版本和现在的版本比较并且创建一个优化的安装包,其中包含您的应用程序的不同版本之间改变了内容,不包括没有改变的内容。比较会看应用程序包文件中的一切,包括应用的可执行文件,nib文件,本地化文件,图片文件,视频文件,音频文件,文本文件和包含数据的自定义格式文件。

注意:对于不通过AppStore发布应用的开发者,例如分发企业级应用程序,创建更新包是不可用的。

当使用优化时,更新包会比应用的整个安装包明显变小并且安装更新会更快。此外,在许多情况下,这种机制将会允许在蜂窝网络下更新受下载大小限制的应用。

除了新的内容,更新包中包含如何把应用的老版本改变成新版本的说明:将要添加的新文件,修改的文件会被更新的相应文件替换,并且在应用变化中删除了的文件将会删除。对于开发者和用户来说,这个过程是完全透明的,通过更新的应用和完全下载的更新版本应用没有区别。

优化你的应用程序的更新的大小,你应该考虑两个小技巧:

·       不要进行不必要的文件修改。通过diff或者其他目录比较工具比较您的应用老版本与新版本的内容并且确认应用程序包中仅仅改变了你希望的改变。

·       更新中你希望改变的和不希望改变的东西应该分别存储在不同的文件中。这可以减少更新包的大小,并且增加其安装速度。

对于运行 iOS6.x的设备,新版本应用更新包中改变的任何文件会整体改变。例如,如果你的应用中有一个10MB的文件仅仅改变1KB的内容那么在新版本中的应用中,更新包中将会包含整整10MB的文件。

对于运行 iOS7.0及更高版本的设备,更新包中改变的文件可以仅包括老版本和新版本的不同而不是整个文件。在改变一个大文件中的小部分时会显著的减小更新包的大小,但是会增加设备上安装更新的时间。出于这个原因,对于iOS7.0及更高版本上面的两个小技巧仍然是重要的。尽量减少变更的内容,并将其变为许多小文件,而不是一个更大的单片文件将减少下载大小并在所有情况下,将加快iOS7.0及更高版本的设备上的安装。

警告:您的应用应该不再依赖于应用程序包中的创建和修改日期。当您的应用通过使用更新包更新时,文件仅当内容改变时被更新并且如果仅仅是它们的元数据(例如,创建日期和修改日期)改变,不会被更新。

原文地址:https://developer.apple.com/library/ios/qa/qa1779/_index.html

2014 / . 02 / . 08

地铁闹钟 到站提醒

是否因为玩游戏,刷微博,听音乐而错过了下车?

 地铁中及时提醒您到站信息还可以设置距离提前提醒到站;  

 支持 IOS 7  IOS 6, 支持横屏玩游戏时再也不用转来转去设置闹铃 ; 

 有多达 20 首铃声让您选择。

下载地址:  https://itunes.apple.com/cn/app/de-tie-nao-zhong/id784240505?mt=8

 地铁闹钟 到站提醒

 

2013 / . 04 / . 12

Xcode 断点使用心得

首先,找到断点管理器。

Command + 6 跳转到如图位置:

Xcode 断点使用心得

 在它下方有:

Xcode 断点使用心得

+号增加断点,-号删除选中断点。勾符号显示当前有效断点,之后是搜索框。

点击加号出现如图菜单:

Xcode 断点使用心得

 

异常断点 (Exception breakpoint)

选中 “Add Exception Breakpoing”,出现菜单,如下图:

Xcode 断点使用心得

Exception:可选 all 所有语言引起的异常,objective-c语言c++语言引起的异常。

Break:可选onThrowonCatch

Action:可在程序断点执行后增加额外动作(Applescript,捕捉动画帧速,调试器命令(lldb),输入log记录,终端命令(shell,播放声音)

例如:Debugger Commond中可填入

po item 输出 item变量的值 

bt 表示输出 方法调用堆栈信息

 

符号断点(symbolic breakpoint)

选中 “Add Exception Breakpoing”,出现菜单,如下图:

Xcode 断点使用心得

Symbol填入你想检测消息发送实体的方法

(例如:-[NSException raise]-号是实例方法,+号是类方法)。

你也可以输入:

objc_exception_throw

malloc_error_break  //跟踪调试释放了2次的对象

 -[NSObject doesNotRecognizeSelector:]  //向某个object发送没有的方法

Module:填入是否在一个dylib中,默认不用填。

Conditon:填入条件,例如:

(BOOL)[item isEqualToString:@"test"]

前面的(BOOL)是必须的。否则console会提示类型不符号,导致条件不能生效。

意思是item(NSString)是test时停下。

同样可以写一下判断的方法比如用来确定类类型的isKindOfClass:,确定对象在继承体系中的位置的isMemberOfClass:,判断一个对象是否能接收某个特定消息的respondsToSelector:,判断一个对象是否遵循某个协议的conformsToProtocol:,以及提供方法实现地址的methodForSelector:。

Ignore:忽略几次。

Action:同上表示在执行后附加动作。

普通断点

右击在Xcode左侧行号上的断点,出现如图菜单:

Xcode 断点使用心得

之后编辑断点,如图:

Xcode 断点使用心得 

几个选项用法和前面一样。

提示:

1.使用Command + |(回车上的那个键)即可在当前行增加、删除断点。

2.在下图情况下(断点运行起来后)可以让鼠标在行号停留下

Xcode 断点使用心得

出现如图的小箭头

Xcode 断点使用心得

点击它,即可跳到这句(86行)。

 

2013 / . 03 / . 19

Xcode 重构工具 Refactor

 

Xcode 重构工具 Refactor

Xcode 中重构是件很轻松的事情,选中你的代码右键,弹出如上的菜单,

下面我来介绍下重构中各个工具的适用情况和使用方法:

Rename 重命名:

适用情况:

当你的代码写到一半,发现变量,方法或者类名定义不合适,手动修改变量或方法名会引起Xib文件的outlet不能识别。

使用方法:

1.选中变量名,右键选中Refactor->Rename

2.弹出如下窗口:

Xcode 重构工具 Refactor

提示:Rename related files -- 重命名相关文件

infoData重命名,接下来会弹出如下窗口:

Xcode 重构工具 Refactor

可以看到infoData这个属性在哪里将被修改。

提示:如果想在某处放弃修改,可以在文件浏览器中间点击如下按钮放弃修改。

Xcode 重构工具 Refactor

注意:在协议当中无法使用Rename

Extract 提取:

适用情况:

每个方法只负责做好一件事,但往往我们写代码时忘记了提取可以重用的方法,这时可以使用Extract,它的方便之处在于能够检测提取的方法当中变量的使用情况,可以把没有声明的变量作为参数传递给新提取的方法。

使用方法:

1.选中变量名,右键选中Refactor->Extract

2.弹出如下窗口:

Xcode 重构工具 Refactor

提示:New method objective c方法, New fuction c函数。

选择Preview

3.弹出如下窗口:

Xcode 重构工具 Refactor

可以看到新方法的预览,点击Save确定保存。

Create SuperClass 创建父类:

适用情况:

假设你有一个Person类还有一个它的子类smallStudent类。现在你想给smallStudent类提取出一些方法并抽象成smartStudent的父类Student类,手动修改会比较麻烦:需要新建一个Student类并且修改smartStudent类继承自Student类。这时使用Create SuperClass来为smallStudent创建一个父类。

使用方法:

1.选中类名,右键选中Refactor->Create SuperClass

2.弹出如下窗口:

Xcode 重构工具 Refactor

输入父类的名字Student

提示:

Create files for new superclass --为新的父类新建文件。

Add superclass ot smallStudent's flies -- 在当前文件当中(smallStudent)加入父类。

3.弹出如下窗口:

Xcode 重构工具 Refactor

点击Save,新建smallStudent的父类Student,继承自Person类。

Move Up /Move Down 上移/下移:

适用情况:

假设你还是有一个Person类和它的子类Student,在Student当中有一个实例变量name,你想把它提取出来给父类,手动的修改比较费力,这时我们可以直接使用Move Up(同样,我们也可以把父类的某个实例变量或方法移动到它的子类当中)

使用方法:

1.选中属性,右键选中Refactor->Move Up

2.弹出如下窗口:

Xcode 重构工具 Refactor

提示:Move related methods -- 移动关联实例变量的方法。

3.同样点击Save保存修改。

Encapsulate 封装:

适用情况:

对于某些类中的成员,你需要自己写setget方法(比如延时实例化)而不是用@property@synthesize(Xcode 4.4 后只需@property),这时你需要删除@property并使用EncapsulateEncapsulate支持结构体和成员变量生成Setget方法。

使用方法:

1.选中类中的成员变量名,右键选中Refactor->Encapsulate

2.弹出如下窗口:

Xcode 重构工具 Refactor

Getter方法名:name Setter方法名:setName

3.弹出预览窗口:

Xcode 重构工具 Refactor

点击Save生成方法。

2013 / . 03 / . 17

Mac OS X 减肥

Mac OS X 减肥

   Xslimmer是一款为Mac OS X中程序减肥的工具,它的效果非常不错,在我的Mac OS X 10.8.3中清理了5GB多的空间,比起其它同类软件增加了清理32位或64位架构的选项,对于Mac上的每一个应用程序往往是包含32位和64位两个版本,而你的系统只会是32位或64位,并不需要另一种架构的程序。

使用步骤如下:

1.     进入设置

Mac OS X 减肥

2.     General选项卡当中去掉第二项,不备份删除的程序包。

Mac OS X 减肥

3.     在语言选项卡当中,滑动Languages to keep 滚动条,保持2种语言。

      Mac OS X 减肥

4.     在高级选项卡当中选择如下设置(保留一种架构,立即清理)

Mac OS X 减肥

5.     在程序下方找到,点击后立即为所有程序减肥。

Mac OS X 减肥

 

Xslimmer 1.9.1 下载地址:

http://pan.baidu.com/share/link?shareid=71608&uk=4077149492

2013 / . 03 / . 16

Objective c 异常处理方法

ios开发当中,由于runtime机制,往往程序在运行时才会发现:哎?我的程序怎么又崩溃了。。。

在最近的一个多人项目当中,在程序启动时从网络请求回来的数据格式经常会变动,导致解析成数组(NSMutableArray)或字典(NSMutableDictionary)往往出界导致崩溃,而另一个开发后台的程序员不可能立即修改好程序,这时需要我们使用@try@catch@finally来处理这些不可预知的错误,避免影响我们的工作。

范例代码如下:

@try {

//可能出问题的代码

}

@catch(NSException *exception) {

//发生异常会进入这里

//输出异常的名字和原因

NSLog(@"Caught %@%@", [exception name], [exception reason]);

}

@finally{

//不论是否异常都会进入这里

}


当然你也可以通过在@try当中使用@throw分情况处理异常。

范例代码如下:

//定义一个异常

NSException* ex = [[NSExceptionalloc]initWithName:@"异常名称"

                                                     reason:@"异常原因"

                                                  userInfo:nil];

//抛出异常

@throw(ex);

2013 / . 03 / . 16

iOS6下Objective-C最新特性【转载】

原文地址:

http://blog.csdn.net/mygamezone/article/details/8676324

WWDC2012发布了iOS6,同时为Objective C带来了一些新特性以简化编程。下面是这些新特性,需要XCode4.4及以上版本支持:

1.方法的申明顺序不再要求
在方法里面可以调用在后面申明的方法,编译器会帮助查找方法的申明,顺序不再要求。如下:

@interface SongPlayer : NSObject

- (void)playSong:(Song *)song;

@end

 

@implementation SongPlayer

- (void)playSong:(Song *)song {

  NSError *error;

  [self startAudio:&error];//XCode4.4以前会提示方法未定义,XCode4.4以后可以放心使用

}

- (void)startAudio:(NSError **)error { ... }

@end

2.枚举支持强类型
XCode4.4以前定义枚举使用如下方式,相当于定义了类型为int的枚举类型。

typedefenum{

    NSNumberFormatterNoStyle,

    NSNumberFormatterDecimalStyle,

    NSNumberFormatterCurrencyStyle,

    NSNumberFormatterPercentStyle,

    NSNumberFormatterScientificStyle,

    NSNumberFormatterSpellOutStyle

} NSNumberFormatterStyle;

// typedef int NSNumberFormatterStyle;

XCode4.4以后可以为枚举指明强类型,这样在赋值时会有强类型限制(需要在Build Setting开启Suspicious implicit conversions)。定义如下:

typedef enum NSNumberFormatterStyle : NSUInteger {

    NSNumberFormatterNoStyle,

    NSNumberFormatterDecimalStyle,

    NSNumberFormatterCurrencyStyle,

    NSNumberFormatterPercentStyle,

    NSNumberFormatterScientificStyle,

    NSNumberFormatterSpellOutStyle

} NSNumberFormatterStyle;

或使用NS_ENUM宏来定义

typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) {

    NSNumberFormatterNoStyle,

    NSNumberFormatterDecimalStyle,

    NSNumberFormatterCurrencyStyle,

    NSNumberFormatterPercentStyle,

    NSNumberFormatterScientificStyle,

    NSNumberFormatterSpellOutStyle

};

3.默认属性合成

@interface Person : NSObject

@property(strong) NSString *name;

@end

@implementation Person {

    NSString *_name;//这句可以省略,XCode很早就可以了

}

@synthesize name = _name;//XCode4.4以后,这句也可以省略,XCode默认合成带下划线的成员变量

@end

即可以简化为:

@interface Person : NSObject

@property(strong) NSString *name;//ARC开启,否则需要自己release

@end

@implementation Person

@end

4.创建NSNumber的新语法
XCode4.4以前的创建方式:

NSNumber*value;

value = [NSNumber numberWithChar:'X'];

value = [NSNumber numberWithInt:12345];

value = [NSNumber numberWithUnsignedLong:12345ul];

value = [NSNumber numberWithLongLong:12345ll];

value = [NSNumber numberWithFloat:123.45f];

value = [NSNumber numberWithDouble:123.45];

value = [NSNumber numberWithBool:YES];

XCode4.4以后可简化为:

NSNumber*value;

value = @'X';

value = @12345;

value = @12345ul;

value = @12345ll;

value = @123.45f;

value = @123.45;

value = @YES;

XCode4.4以前,使用语句创建NSNumber:

NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )];

NSNumber *hexDigit = [NSNumber numberWithChar: "012345679ABCDEF"[i % 16]);

NSNumber *usesScreenFonts = [NSNumber numberWithBool:

                              [NSLayoutManager usesScreenFonts]];

NSNumber *writingDirection = [NSNumber numberWithInt:

                                NSWritingDirectionLeftToRight];

NSString *path = [NSString stringWithUTF8String: getenv("PATH")];

XCode4.4以后可以通过”()”方式创建:

NSNumber *piOverSixteen = @( M_PI / 16 );

NSNumber *hexDigit = @( "012345679ABCDEF"[i % 16] );

NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSString *path = @( getenv("PATH") );

5.创建NSArray的新语法

NSArray* array;

array = @[ a, b, c ];

//相当于使用下面的方式创建:

id objects[] = { a, b, c };

NSUInteger count = sizeof(objects)/ sizeof(id);

array = [NSArray arrayWithObjects:objects count:count];

6.创建NSDictionary的新语法

NSDictionary*dict;

dict = @{};

dict = @{ k1 : o1 };

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

//相当于如下方式:

id objects[] = { o1, o2, o3 };

id keys[] = { k1, k2, k3 };

NSUInteger count = sizeof(objects) / sizeof(id);

dict = [NSDictionary dictionaryWithObjects:objects

                                   forKeys:keys

                                     count:count];

7.mutable对象的创建,调用对象的-mutableCopy方法

NSMutableArray *mutablePlanets =

[@[

  @"Mercury", @"Venus", @"Earth",

  @"Mars", @"Jupiter", @"Saturn",

  @"Uranus", @"Neptune"

] mutableCopy];

8.静态容器对象的创建,使用+initialize方法

@implementation MyClass

static NSArray *thePlanets;

+ (void)initialize {

  if (self == [MyClass class]) {

    thePlanets = @[

      @"Mercury", @"Venus", @"Earth",

      @"Mars", @"Jupiter", @"Saturn",

      @"Uranus", @"Neptune"

    ];

  }

}

9.可变数组新的存取方式:

@implementation SongList {

  NSMutableArray *_songs;

}

- (Song *)replaceSong:(Song *)newSong atIndex:(NSUInteger)idx {

    Song *oldSong = _songs[idx];//使用[idx]访问子对象

    _songs[idx] = newSong;//使用[idx]设置子对象

    return oldSong;

}

10.可变字典新的存取方式:

@implementation Database {

  NSMutableDictionary *_storage;

}

- (id)replaceObject:(id)newObject forKey:(id )key {

    id oldObject = _storage[key];//相当于id oldObject = [_storage objectForKey:key];

    _storage[key]= newObject;//相当于[_storage setObject:object forKey:key];

    return oldObject;

}

2013 / . 03 / . 15

ios开发减小程序体积大小方法--使用TexturePacker

TexturePacker是一款可拼接图片和优化图片大小的工具,

在mac和windows,linux都有相应的版本。

因为移动设备上存储空间有限,或者用户不愿等待下载所以我们需要尽量减小程序。

而在图片存储上有一个问题,图片是以4px的倍数存储,

比如你的图片是13px*13px大小的,可实际它占用是16px*16px的大小。

所以拼接图片就会减少一部分图片实际浪费的空间。

使用这个工具的步骤如下:

1.选择工具栏中的ios开发减小程序体积大小方法--使用TexturePacker,添加要合并的图片。

2.选择左侧的Geometry,调整图片大小,注意勾选Force squared(强制正方形),

同时观察是否有图片没有包含在工作区中。

ios开发减小程序体积大小方法--使用TexturePacker

3.选择左侧的Output (输出选项),有各种格式的选择,

推荐ImageFormat使用RGBA5555(图像位数),

Dithering(抖动算法)选择FloydSteinbergAlpha。

ios开发减小程序体积大小方法--使用TexturePacker

4.保存当前的工程文件 ios开发减小程序体积大小方法--使用TexturePacker,方便以后修改。

5.点击ios开发减小程序体积大小方法--使用TexturePacker输出拼接和优化后的图片。

 

TP工具需要注册,如果没有注册可能不能使用高级特性,没办法优化图片,发布时可能有红字警告。

不过你可以试用一周或者申请一个免费的LISENCE.

前提是:

要有一个技术博客,必须是IT技术博客。

需要保证近6个月内有至少4篇博文更新。

2013 / . 03 / . 15

Ios模拟器截图工具推荐

默认的模拟器截图快捷为commod+s,截出的图片没有边框。

推荐一个工具ios-simulator cropper ,可以截出带边框的模拟器截图。

下载地址 http://www.curioustimes.de/iphonesimulatorcropper/

对于发布应用程序时很有帮助,使用方法很简单。

如果报错可能是你的模拟器边框没有显示或者是Purpose of result image选择有问题。

Ios模拟器截图工具推荐

2013 / . 03 / . 15

如何隐藏mac下Dock中的图标

如何隐藏mac下Dock中的图标

slidePad 是一款 不错的笔记软件,可以用 快捷键(option + 空格键)从屏幕旁边弹出。

如何隐藏mac下Dock中的图标

最新版本中在Dock中会占图标,而我想隐藏它的图标(所有mac程序都适用)可以使用如下方法。

1.右击程序->显示包内容。

2.在Contents文件夹中找到Info.plist文件,使用plist编辑器打开。

3.添加Application is agent (UIElement)项,Boolean值为Yes。

现在程序的图标和菜单就隐藏了。

2011 / . 12 / . 18

朋友,软件

不知不觉,20了,怀念以前的98,怀念以前的仙剑,不知以后能否还有令人感动的软件,让人感觉像朋友一样的软件,是否自己以后能做出满意的软件,是否在这个追求效率的时代还有人能十年磨一剑。让软件成为一件艺术品。