【IOS】What Is New in Cocoa Touch

更多的外观自定义

从iOS5开始,Apple就逐渐致力于标准控件的可自定义化,基本包括颜色,图片等的替换。对于标准控件的行为,Apple一贯控制的仍是比较严格的。而开发者在作app时,最好仍是遵照Apple的人机交互手册来肯定控件的功能,不然可能遇到意想不到的麻烦…

iOS6中Apple继续扩展了一些控件的可定义性。对于不是特别追求UI的开发团队或者实力有限的我的开发者来讲这会是一个不错的消息,使用现有的资源和新加的API,能够快速开发出界面还不错的应用。 html

UIPopoverBackgroundView

UIPopoverBackgroundView是iOS5引入的,能够为popover自定义背景。iOS6中新加入了询问是否以默认方式显示的方法:
+ (BOOL)wantsDefaultContentAppearance;
返回NO的话,将以新的立体方式显示popover。

具体关于UIPopoverBackgroundView的用法,能够参考文档 ios

UIStepper

UIStepper也是iOS5引入的新控件,在iOS5中Apple为标准控件自定义作出了至关大的努力(能够参看WWDC2011的相关内容),而对于新出生的UIStepper却没有相应的API。在iOS6里终于加上了..能够说是预料之中的。
@property (nonatomic,retain) UIColor *tintColor;
这个属性定义颜色。

- (void)setBackgroundImage:(UIImage*)image forState:(UIControlState)state;

- (void)setDividerImage:(UIImage*)image forLeftSegmentState:(UIControlState)left rightSegmentState:(UIControlState)right; git

- (void)setIncrementImage:(UIImage *)image forState:(UIControlState)state; github

- (void)setDecrementImage:(UIImage *)image forState:(UIControlState)state; 能够定义背景图片、分隔图片和增减按钮的图片,都很简单明了,彷佛没什么好说的。 安全

UISwitch

一样地,如今有一系列属性能够自定义了。
@property (nonatomic, retain) UIColor *tintColor;

@property (nonatomic, retain) UIColor *thumbTintColor; session

@property (nonatomic, retain) UIImage *onImage; app

@property (nonatomic, retain) UIImage *offImage; 其中thumbTintColor指的是开关的圆形滑钮的颜色。另外对于on和off时候能够自定义图片,那么很大程度上其实开关控件已经能够彻底自定义,基本再也不须要本身再去实现一次了.. ide

UINavigationBar & UITabBar

加入了阴影图片的自定义:
@property (nonatomic,retain) UIImage *shadowImage;
这个不太清楚,没有本身实际试过。之后有机会作个小demo看看能够…

UIBarButtonItem

如今提供设置背景图片的API:
- (void)setBackgroundImage:(UIImage *)bgImage 
                  forState:(UIControlState)state 
                     style:(UIBarButtonItemStyle)style 
                barMetrics:(UIBarMetrics)barMetrics;
这个很是有用…之前在自定义UINavigationBar的时候,对于BarButtonItem的背景图片的处理很是复杂,一般须要和designer进行不少配合,以保证对于不一样宽度的按钮背景图均可以匹配。如今直接提供一个UIImage就OK了..初步目测是用resizableImageWithCapInsets:作的实现..很赞,能够偷很多懒~

UIImage的API变化

随着各种Retina设备的出现,对于图片的处理方面以前的API有点力不从心..反应最大的就是图片在不一样设备上的适配问题。对于iPhone4以前,是普通图片。对于iPhone4和4S,因为Retina的缘由,须要将图片宽高均乘2,并命名为@2x。对于遵循这样原则的图片,cocoa touch将会自动进行适配,将4个pixel映射到1个point上去,以保证图片不被拉伸以及比例的适配。对于iPhone开发,相关的文档是比较全面的,可是对于iPad就没那么好运了。Apple对于iPad开发的支持显然作的不如对iPhone那样好,因此不少iPad开发者在对图片进行处理的时候每每不知所措——特别是在retina的new iPad出现之后,更为严重。而此次UIImage的最大变化在于本身能够对scale进行指定了~这样虽然在coding的时候变麻烦了一点,可是图片的Pixel to Point对应关系能够本身控制了,在作适配的时候能够省心很多。具体相关几个API以下:
+ (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale;

- (id)initWithData:(NSData *)data scale:(CGFloat)scale; 学习

+ (UIImage *)imageWithCIImage:(CIImage *)ciImage 
scale:(CGFloat)scale 
orientation:(UIImageOrientation)orientation; 编码

- (id)initWithCIImage:(CIImage *)ciImage 
scale:(CGFloat)scale 
orientation:(UIImageOrientation)orientation; 指定scale=2以后便可对retina屏幕适配,相对来讲仍是比较简单的。

UITableView的改动

UITableView就很少介绍了,基础中的基础…在iOS5引入StoryBoard以后,由StoryBoard生成的UITableViewController中对cell进行操做时全部的cell的alloc语句均可以不写,能够为cell绑定nib等,都简化了UITableView的使用。在iOS6中,对cell的复用有一些新的方法:
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier;
将一个类注册为某个重用ID。
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier 
                           forIndexPath:(NSIndexPath *)indexPath;
将指定indexPath的cell重用(若不能重用则返回nil,在StoryBoard会自动生成一个新的cell)。

另外,对UITableView的Header、Footer和Section分隔添加了一系列的property以帮助自定义,而且加入了关于Header和Footer的delegate方法。能够说对于TableView的控制更强大了…

UIRefreshControl

这个是新加的东西,Apple的抄袭之做,官方版的下拉刷新。下拉刷新自出现的第一分钟起,就成为了人民群众喜闻乐见的手势,对于这种获得大众承认的手势,Apple是必定不会
放过的。

相对与如今已有的开源下拉刷新来讲,功能上还不那么强大,可自定义的内容很少,并且须要iOS6之后的系统,所以短时间内还难以造成主流。可是相比开源代码,减去了拖源码加库之类的麻烦,而且和系统整合很好,再加上Apple的维护,相信将来是有机会成为主流的。如今来讲的话,也就只是一种实现的选择而已。

UICollectionView

这个是iOS的UIKit的重头戏..必定意义上能够把UICollectionView理解成多列的UITableView。开源社区有不少相似的实现,基本被称做GridView,我我的比较喜欢的实现有 AQGridView GMGridView .开源实现基本上都是采用了和UITableView相似的方法,继承自UIScrollView,来进行多列排列。功能上来讲相对都比较简单..

而UICollectionView能够说是很是强大..强大到基本和UITableView同样了..至少使用起来和UITableView同样,用惯了UITableView的童鞋甚至能够不用看文档就能上手。同样的DataSource和Delegate,不一样之处在于多了一个Layout对象对其进行排列的设定,这个稍后再讲。咱们先来看Datasource和Delegate的API

//DataSource

-numberOfSectionsInCollectionView:

-collectionView:numberOfItemsInSection:

-collectionView:cellForItemAtIndexPath:

//Delegate

-collectionView:shouldHighlightItemAtIndexPath:

-collectionView:shouldSelectItemAtIndexPath:

-collectionView:didSelectItemAtIndexPath: 没什么值得说的,除了名字之外,和UITableView的DataSource和Delegate没有任何不一样。值得一提的是对应的UICollectionViewCell和UITableViewCell略有不一样,UICollectionViewCell没有所谓的默认style,cell的子view自下而上有Background View、Selected Background View和一个Content View。开发者将自定义内容扔到Content View里便可。

须要认真看看的是Layout对象,它控制了整个UICollectionView中每一个Section甚至Section中的每一个cell的位置和关系。Apple提供了几种不错的Layout,足以取代如今经常使用的几个开源库,其中包括了像Linkedin和Pinterest的视图。能够说Apple对于利用AppStore这个平台,向第三方开发者进行学习的能力是超强的。

关于UICollectionView,在以后有两个session专门进行了讨论,我应该也会着重看一看相关内容,以后再进行补充了~

UIViewController

这个绝对是重磅消息~ 一直以来咱们会在viewDidUnload方法中作一些清空outlet或者移除observer的事情。在viewDidUnload中清理observer其实并非很安全,所以在iOS5中Apple引入了viewWillUnload,建议开发者们在viewWillUnload的时候就移除observer。而对于出现内存警告时,某些不用的view将被清理,这时候将自动意外执行viewWillUnload和viewDidUnload,极可能形成莫名其妙的crash,而这种内存警告形成的问题又由于其随机性难以debug。

因而Apple此次作了一个惊人的决定,直接在iOS6里把viewWillUnload和viewDidUnload标注为了Deprecated,而且再也不再会调用他们。绝大部分开发者实际上是对iOS3.0以来就伴随咱们的viewDidUnload是有深深的感情的,可是如今须要和这个方法说再见了。对于使用iOS6 SDK的app来讲不该该再去实现这两个方法,而以前在这两个方法中所作的工做须要从新考虑其更合适的位置:好比在viewWillDisappear中去移除observer,在dealloc中将outlet置为nil等。

状态恢复

在以前的一篇iOS6 SDK的简述中已经说过这个特性。简单讲就是对每一个view如今都多了一个属性:
@property (nonatomic, copy) NSString *restorationIdentifier;
经过在用户点击Home键时的一系列delegate里对现有的view进行编码存储后,在下一次打开文件时进行解码恢复。更多的详细内容以后也会有session进行详细说明,待更新。
相关文章
相关标签/搜索