【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進行詳細說明,待更新。
相關文章
相關標籤/搜索