月度归档:2015年04月

10个无版权限制的免费大图片资源网站

对于网页设计师和平面设计师来说,图片素材是十分重要的,特别是无版权限制的素材。虽然国内有很多素材下载站,但是大部分都没有版权描述,这样会让用户不知道是否可以免费使用这些素材。

没关系,今天小编为大家整理目前优秀的提供免费图片素材资源网站,这些网站的图片质量相当高,大部分为高分辨率(高解析),并且,最重要的是,它是免费的,无版权限制哦!同时具备免费、高清(无码)、无限制这三大因素的图片资源站绝壁是干货中的干货!

NO.1 Gratisography

http://www.gratisography.com/

gratisography里面的图片每周都会更新,很多时尚流行的照片在里面,并且适合用在设计项目上。

免费个人、商业使用。

 

NO.2 PicJumbo

http://picjumbo.com/page/5/

PicJumbo提供免费个人和商业使用的图像,照片质量很不错,非常适合用在界面设计或其它项目上。

 

NO.3 Life Of Pix by LEEROY

http://www.lifeofpix.com/

http://www.leeroy.ca/en/

提供免费高清图像素材,并且无版权限制,图片多为欧洲景观。

 

NO.4 IM Free

http://www.imcreator.com/free

该站提供搜索和分类目录,有人物、自然、艺术、生活、图标等分类。确实不错,可惜有的分类很少图。

 

NO.5 Death To Stock Photos

http://deathtothestockphoto.com/

用户需要邮箱订阅后才能获取该网站上的图片,然后该站每月会向你发送免费的图片素材。

 

NO.6 Pixabay

http://pixabay.com/

寻找免费且高质量的图片是件单调乏味的任务——主要是源于版权问题,署名要求或者仅仅是图片质量不够。因此我们深受启发而创立了Pixabay——一间超高质量无版权限制的图片的贮藏室。 不论数字或者印刷格式,个人或者商业用途,您都可以免费使用本网站任何图像,并且无原作者署名要求。

 

NO.7 Publicdomainarchive

http://publicdomainarchive.com/

目前已经有5万张免费高清图像下载,设计师可以免费使用在你的创意项目上。

 

NO.8 Snapographic

http://snapographic.com/

Snapographic分享的图像也被分类了,有动物、建筑、景观、纹理等图像素材,当然也是免费使用的。

 

NO.9 Photo Pin

http://photopin.com/

Photo Pin 图片搜索引擎,图片资源来自Flickr,你可以使用英文和中文搜索,但结果会有所不同,所以可以通过切换语言来搜索,获得最适合的图像。

 

NO.10 New Old Stock

http://nos.twnsnd.co/

New Old Stock专注分享世界各地的经典、旧风格的图像,如果要做复古风的项目,从这里选择图片素材最适合不过了。

 

iOS工程师面试必会基础知识36题

这一篇是iOS基础知识,转自网友的的面试总结,希望对大家有帮助。

1、必须熟悉的关键字

@interface声明类,@implementation实现类。@protocol声明协议,@optional与@protocol配合使用,说明协议中的某个或者某几个方法可以不实现。@required与@protocol配合使用,说明协议中的某个方法或者某几个方法必须实现。@end与@interface ,@implementation,@protocol配合使用,代表声明或者实现结束。

2、id

id是指向Objective-C类对象的指针,它可以声明为任何类对象的指针,当在Objective-C中使用id时,编译器会假定你知道,id指向哪个类的对象。与void*是不同的是,void*编译器不知道也不假定指向任何类型的指针。

3、nil

定义为一个常量,如果一个指针的值为nil,代表这个指针没有指向任何对象。

4、self

在Objective-C中,关键字self与c++中this是同一概念,就是类对象自身的地址,通过self可以调用自己的实例变量和方法。

5、Super

当子类需要调用父类的方法时,会用到Super关键字. Super指向的是父类的指针,子类重写父类的方法时,调用父类的方法是一个比较好的习 惯。因为 当我们不知道父类在该方法中实现的功能时,如果不调用父类的方法,有可能我们重写的方法会失去该功能,这是我们不愿意看到的情况。

6、NSNull

NSNull是没有的意思,如果一个字典的值为NSNull,那说明与该值对应的Key是没有值的,例如Key为address,说明与address对应的是值是没有。

7、类方法 +

如果想声明属于类而不属于类对象的方法,用+。+用来修饰类的方法,使用+修饰的类方法,是整个类的方法,不属于哪一个类对象,这与C++中的static在类中使用的概念一样。

8、%@

在NSLog中,使用%@表示要调用对象的description方法。

9、类

是一种结构,它表示对象的类型,就像int与 char 一样,也可以声明类的变量(对像)。

10、实例化

为类的对象分配内存和初始化,达到可以使用该 类对象的目的。

11、对象(实例)

类的实例化后的产物。

12、消息

在Object-C中,类的对象执行的操作,是通过给该类或者该类对象发送消息实现,如:[object func];就是给object对象发送 func消息,类似C++中的方法调用。给object对象发送func消息后,object对象查询所属类的func方法执行。

13、方法调度

当向一个对象发送消息时(调用方法),这个方法是怎么被调用的呢?这就依赖于方法调度程序,方法调度程序查找的方法如下:

在本类的方法中,找被调用的方法,如果找到了,就调用,如果找不到被沿着继承路径去查找,从哪个类找到,就调用哪个类的方法,如果到最根上的类还是没有找到,那编译就会出错。

14、继承与复合

在Objective-C中支持继承,但只是支持单一继承(有且只有一个父类),如果想使用多继承的特性,可以使用分类和协议技术。继承是is-a,复合是has-a。复合是通过包含指向对象的指针实现的。

15、装箱与拆箱

由于NSArray,NSDirectory等类不能直接存储基本数据类型,所以要想在NSArray\NSDirectory中使用基本数据类型,就得使用装箱与拆箱。

在Objective-C中,可以使用NSNumber和NSValue来实现对数据类型的包装,NSNumber可以实现对基本数据类型的包装,NSValue可以实现对任意类型数据的包装。

将基本类型封装成对象叫装箱,从封装的对象中提取基本类型叫拆箱(取消装箱),其它语言如Java原生支持装箱与拆箱,Ojbective-C不支持自动装箱与拆箱,如果需要得需要自己来实现装箱与拆箱。(NSKeyedArchiver、NSKeyedUnarchiver)。

16、存取方法

在使用类对象的实例变量(成员数据)时,不要直接使用对象中的实例,要使用存以方法来获取或者修改实例,既setter和getter,在 Cocoa中, 存取方法有命名习惯,我们得符合这种习惯,以便于与其它团队成员合作。setter方法是修改或者设置实例值,命名习惯为set+实例名,例有一个类有 path实例变量,那setter命名为setPath,getter命名为Path,为什么不是getPath,因为get在Cocoa中有特殊的含 义,这个含义就是带有get的方法就意味着这个方法通过形参指针(传入函数的参数指针)来返回值。我们要遵守这个命名习惯或者说规则。

在Objective-C 2.0中加入了@property和@synthesize来代替setter和getter,这两个关键字为编译器指令。还有点表达式,存取类成员的值时,可以使用点表达式。

Object.attribute,当点表达式在=号左边时,调用的是setter方法,在=号右边时,调用的是getter方法。

17、@property 语法为:@property (参数) 类型 变量名.

在这里主要说明一下参数.

参数分为三种:

第一种:读写属性包括(readonly/readwrite/)

第二种:setter属性(assign,copy,retain),assign是简单的赋值,copy是释放旧成员变量,并新分配内存地址给成 员 变量,将传入参数内容复制一份,给成员变量。retain是将传入 参数引用计数加1,然后将原有的成员变量释放,在将成员变量指向该传入参数。

第三种:与多线程有关(atomic,nonatomic).当使用多线程时,使用atomic,在不使用多线程时使用nonatomic

18、对象创建与初始化

在Objective-C中创建对象有两种方法,一种是[类 new];另一种是[[类 alloc] init],这两种方法是等价的,但按惯例来讲,使用[[类 alloc] init];

alloc操作是为对象分配内存空间,并将对象的数据成员都初始,int 为0,BOOL 为NO, float 为0.0等。

初始化,默认的初始化函数为init,init返回值为id,为什么回返回id呢,因为要实现链式表达式,在Objective-C中叫嵌套调用。

为什么要嵌套调用?因为初始化方法init返回值可能与alloc返回的对象不是同一个?为什么会发生这种情况?基于类簇的初始化,因为init可以接受参数,在init内部有可能根据不同的参数来返回不同种类型的对象,所以最会发生上面说的情况。

在初始化时,建议使用if (self = [super init])

19、便利初始化(下面解释太绕, 不用看了)

当一个类需要根据不同的情况来初始化数据成员时,就需要便利初始化函数,与init初始化不同的是,便利初始化函数有参数,参数个数可以有1到N个,N是类数据成员个数。

指定初始化函数:什么是指定初始化函数?在类中,某个初始化函数会被指定为指定的初始化函数,确定指定初始化函数的规则是初始化函数中,参数最多的为指定初始化函数,

其它未被指定为指定初始化函数的初始化函数要调用指定初始化函数来实现。对于该类的子类也是一样,只要重写或者直接使用父类的指定初始化函数。

20、自动释放池(深入了解看:《Objective-C高级编程》第一章)

内存管理是软件代码中的重中之重,内存管理的好坏,直接影响着软件的稳定性。在Cocoa中,有自动释放池,这类似于C++中的智能指针。

NSObject有一个方法是autorelease,当一个对象调用这个方法时,就会将这个对象放入到自动释放池中。

drain,该方法是清空自动释放池,不是销毁它。drain方法只适用于Mac OS X 10.4以上的版本,在我们写的代码中要使用release,release适用于所有版本。

自动释放池是以栈的方式实现,当创建一个自动释放池A时,A被压入栈顶,这时将接入autorelease消息的对象放入A自动释放池,这时创建一 个新的 B自动释放池,B被压入栈顶,创建完成后删除B,这个接收autorelease消息的对象依然存在,因为A自动释放池依然存在。

21、类别

什么是类别?类别是一种为现有类添加新方法的方式。

为什么使用类别或者说使用类别的目的是什么?有以下三点:

第一,可以将类的实现分散到多个不同的文件或多个不同的框架中。

如果一个类需要实现很多个方法,我们可以将方法分类,把分好的类形成类别,可以有效的管理和驾驭代码。

第二,创建对私有方法的前向引用。

第三,向对象添加非正式协议。

22、委托(下面的解释不好,可跳过。以后找机会专门总结一下这个知识点。我的软肋之一。)

委托的意思就是你自己想做某事,你自己不做,你委托给别人做。

在Ojbective-C中,实现委托是通过类别(或非正式协议)或者协议来实现。

举个例子:Apple要生产iPhone,Apple自己不生产(种种原因,其中之一就是在中国生产成本低,他们赚的银子多),Apple委托富士 康来生 产,本来富士康原来不生产iPhone,现在要生产了,所以他得自己加一个生产iPhone的生产线(类别,增加生产iPhone方法),这就是通过类别 来实现委托。

23、非正式协议(同上)

创建一个NSObject的类别, 称为创建一个非正式协议。为什么叫非正式协议呢?

也就是说可以实现,也可以不实现被委托的任务。

24、选择器

选择器就是一个方法的名称。选择器是在Objective-C运行时使用的编码方式,以实现快速查找。可以使用@selector预编译指令,获取 选择器 @selector(方法名)。NSObject提供了一个方法respondsToSelector:的方法,来访问对象是否有该方法(响应该消息)。

25、正式协议

与非正式协议比较而言,在Ojbective-C中,正式协议规定的所有方法必须实现。在Ojbective-C2.0中,Apple又增加了两个关键字,协议中的方法也可以不完全实现,是哪个关键字见关键字部份的@optional,@required。

26、什么是框架

框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等。苹果公司将cocoa,Carbon,QuickTime和OpenGL 等技术 作为框架集提供。cocoa的组成部分有Foundation和Application Kit框架。还有一个支持框架的套件,包含 Core Animation和Core Image,这为Cocoa增添了多种精彩的功能。

每个框架都是一个重要的技术集合,通常包含数十个甚至上百个头文件。每个框架都有一个主头文件,它包含了所有框架的各个头文件。通过使用#import导入主头文件,可以使用所有框架的特性。

27、OOP中得一些术语

类:类是一种结构,它表示对象的类型。对象引用类来获取和本身有关的各种信息,特别是运行什么代码来处理每种操作。

对象:对象是一种结构,它包含值和指向其类的隐藏指针。

实例:实例是“对象”的另一种称呼。

消息:消息是对象可以执行的操作,用于通知对象去做什么。

方法:方法是为响应消息而运行的代码。根据对象的类,消息可以调用不同的方法。

方法调度程序:是objective-c使用的一种机制,用于推测执行什么方法以响应某个特定的消息。

接口:接口是对象的类应该提供的特性的描述。接口不提供实现细节。

实现:实现是使接口正常工作的代码。

28、键/值编码 KVC

是一种间接改变对象状态的方式,其实现方法是使用字符串描述要更改的对象状态部分。

1)valueForKey与setValue:forKey:

这两种方法的工作方式相同。他们首先查找名称的setter(getter)方法,如果不存在setter(getter)方法,他们将在类中查找名为名称或_名称的实例变量。然后给它赋值(取值)。无需通过对象指针直接访问实例变量。

2)路径

键路径的深度是任意的,具体取决于对象图。

键路径不仅能引用对象值,还可以引用一些运算符来进行一些运算,例如获取一组值的平均值或返回这组值中得最小值和最大值。

例如:NSNumber *count;

count = [garage valueForKeyPath:@”cars.@count”];

NSLog(@”We have %@ cars”, count);

我们将路径“cars.@count”拆开,cars用于获取cars属性,它是来自garage的NSArray类型的值。接下来的部分是@count ,其中@符号意味着后面将进行一些运算。

和 cars@sun.mileage

最大值 cars@min.mileage

最小值 cars@max.mileage

3)整体操作

KVC非常棒的一点是,如果向NSArray请求一个键值,它实际上会查询数组中得每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你。这种方法也适用于通过键路径访问的对象内部的数组。

4)批处理

KVC包含两个调用,可以使用他们对对象进行批量更改。第一个调用是dictionaryWith-ValuesForKeys:。它接受一个字符串数组。该调用获取一些键,对每个键使用valueForKey:,然后为键字符串和刚才获取的值构建一个字典。

29、Object-C有多继承吗?没有的话用什么代替?cocoa 中所有的类都是NSObject 的子类

多继承在这里是用protocol 委托代理 来实现的,你不用去考虑繁琐的多继承 ,虚基类的概念.多态特性 在 obj-c 中通过委托来实现.

30、#import和#include的区别,@class代表什么?

@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import

而#import比起#include的好处就是不会引起重复包含。

31、线程和进程的区别?

进程和线程都是由操作系统下的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一 个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程 序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

32、堆和栈的区别?

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

申请大小:

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因 此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的.

33、为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?

避免循环引用。

34、tableView的重用机制?

查看UITableView头文件,会找到NSMutableArray* visiableCells,和 NSMutableDictionery* reusableTableCells两个结构。visiableCells内保存当前显示的 cells,reusableTableCells保存可重用的cells。

TableView显示之初,reusableTableCells为空,那么 tableView dequeueReusableCellWithIdentifier:CellIdentifier返回nil。开始的cell都 是通过 [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。

比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:

1.[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到 visiableCells数组,reusableTableCells为空。

2.向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。 cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。

3.接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的 cell,cellForRowAtIndexPath再次被调用的时 候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出 visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。

35、怎么理解MVC,在Cocoa中MVC是怎么实现的?

Model: 代表你的应用程序是什么(不是怎么展现)。

Controller: 控制你的Model怎么展现给用户(UI逻辑)。

View: Controller的奴隶。

1 Model,Controller,View相互通讯的规则:

Controller可以直接和Model通信。

Controller也可以直接和View通信。

Model和View永远不能直接通信。

iOS中View和Controller的通信是透明和固定的,主要通过outlet和action实现。

View使用Delegate接口和Controller同步信息。

View不直接和数据通信,使用dataSource接口从Controller处获取数据。

View的delegate和dataSource一般就是Controller。

Controller负责为View翻译和格式化Model的数据。

Model使用Notification & KVO的方式分发数据更新信息,Controller可以有选择的监听自己感兴趣的信息。

View也可以监听广播信息,但一般不是Model发出的信息。

一个完整的App就是很多MVC的集合。

36、delegate和notification区别,分别在什么情况下使用?

Delegate:

消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意,然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:

消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

1. 效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法 的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。 也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反 的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以 notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个 notification后就什么都不管了也不会等待接受者的反应。

1)两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notificaiton。

2)delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就事先把上层的函数通过 delegate传到底层,然后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如 说 NavgationController 从 B 界面到A 点返回按钮 (调用popViewController方法) 可以用delegate 比较好。

什么是线框图、原型和视觉稿及它们的区别

两三年以前,我发现很多搞信息技术的朋友们(非设计师)交付设计时,用着上面列出的词汇。他们以为线框图 (Wireframe)、原型 (Prototype)和视觉稿(Mockup)是一个东西:表达自己创意的线框手绘设计稿。 混淆概念便带来麻烦:他们分不清用户体验设计师的作品,常常感到困惑。「这按钮他妈的怎么点不了?」「我不知道这个地方可以按啊!」类似这样的问题在用户体验的项目中屡见不鲜。误把线框图当成原型,有点像建筑里分不清蓝图(指导如何建筑施工的方案)和演示厅。你完全可以试着在演示厅里小住一会(它的妙处就在于能直观传达房间之美),但你没法舒服地躺在蓝图上;蓝图不过是一张纸罢了。 在建筑学上,演示厅和蓝图服务于不同的交流对象:

  • 蓝图,即施工方案,详细描述该如何建造建筑
  • 演示厅,给未来的居民提供测试和体验的机会

演示厅和蓝图的共同之处是,它们都代表着最终的产品,即建筑(房屋)。线框图、原型和视觉稿亦是如此,这些文档都是最终产品的不同展现方式。 不管你信不信,我向用户体验设计团队授课的第一件事,就是告诉他们分清这三个概念。因为,这实在太重要了。 接下来,让我们详细讨论三者的区别,以后你就懂得在什么样的场合下用什么词汇了。

线框图

1

1、什么是线框图?

线框图 (Wireframe)是低保真的设计图,当明确表达:

  • 内容大纲(什么东西)
  • 信息结构(在哪)
  • 用户的交互行为描述(怎么操作)

线框图不仅仅是无意义的线和框的集合;好吧,虽然看上去是的,囧。你可以把线框图理解为设计图的骨干与核心,它承载着最终产品所有重要的部分。 线框图可以帮你平衡保真度与速度。绘图时不用在意细枝末节,但必须表达出设计思想,不能漏掉任何重要的部分。就像给项目以及一起协作的团队成员(开发工程师、视觉设计师、文案作者和项目经理),开辟了一条辅助理解设计的通道。说得再明白点,你是在设计城市地图,地图上能展现出每一条街道,只不过绘制上做了简化。看地图能看出城市的框架,但无法一览城市的美感。 绘制线框图,重点是「快」。大多数时间请和团队成员沟通,多做思考。审美上的视觉效果则应当尽可能简化。黑白灰是经典用色,你也可以用蓝色代表超链接。如果你在准备线框图时花了大把时间(比如,选择图标、上传图片),请换个简单的方式(比如,使用占位符:一个画×的图片,再加上合适的描述文字)。我们习惯把线框图称为低保真设计图。 切记,好的线框图能像水晶一样,清晰明了地表达设计创意,在成员中无缝传达其思想。

2、何时使用线框图

线框图常常用来作项目说明。鉴于其静态设计,一次只能通过一张界面演示交互,因此,务必附上说明。(只要有必要,简短描述或附在复杂的技术文档里,都成。) 也因为绘制起来快速、简单,它也经常用于非正式场合,比如团队内部交流。要是开发问起一个东西怎么做,回复时不妨附上一张迅速绘制的线框图。线框图难以充当用户测试的材料;倒也能收集些反馈,如果你更关心用户意见,而非测试方法。 虽然近些年遭人闲话,但线框图在整个设计过程中发挥着惊人的效果,在复杂项目的初始阶段必不可少。

原型

2

1、什么是原型

原型(Prototype),常常和线框图混淆,是中等保真的设计图,代表最终产品,模拟交互设计。原型当允许用户:

  • 从界面上,体验内容与交互
  • 像最终产品一样,测试主要交互

原型应该尽可能模拟最终产品,就算长得不是一模一样(绝对不能是灰色线框设计)。交互则应该精心模块化,尽量在体验上和最终产品保持一致。 原型背后的逻辑不要依赖交互形式。减少制作原型的成本,加快开发速度。

2、何时使用原型

原型常用于做潜在用户测试。在正式介入开发阶段前,以最接近最终产品的形式考量产品可用性。 如你所想,原型一般难以成为上好的文档;因为它得让「读者」费一些力气来理解界面。但从另一个角度来看,作为界面,原型的直观和易懂倒使它成为最高效的设计文档。 请注意,相对其它交流媒介,原型成本高、费时。我建议绘制原型后,能在接下来的开发阶段复用起来。(唔,你可能得亲自编写 HTML 和样式表代码)对于简单的项目来说,相当好用。(一旦考虑「复用」,必将增加绘制成本,偏离原型的初衷。并不建议复用。——译者注) 若设计得当,与用户测试相结合,原型是物超所值的。

视觉稿

3

1、什么是视觉稿

视觉稿(Mockup)是高保真的静态设计图。通常来说,视觉稿就是视觉设计的草稿或终稿。优秀的视觉稿当:

  • 表达信息框架,静态演示内容和功能
  • 帮助团队成员以视觉的角度审阅项目

人们常年分不清什么是视觉稿,什么是线框图,和某些软件公司的名字不无关系。噗~

2、何时使用视觉稿

如果你想从股东手里获得认可,视觉稿尤其管用;收集用户反馈也相当好使。 把它添到设计文档里去吧,绝对是画龙点睛之笔。

总结

qq%e6%8b%bc%e9%9f%b3%e6%88%aa%e5%9b%be%e6%9c%aa%e5%91%bd%e5%90%8d