本文轉自App升級iOS7體會。html
xcode5 GM版已經發布,雖然仍是pre-release版,但離最終版不遠了。對於沒有用到新特性的app面臨的最大問題就是UI的變化。Apple提供了UI Transition Guide給開發者,本來打算翻譯一下,沒想到國內早就有譯文了(唉~看來NDA對於某些人而言,等於NULL)。 鑑於此,這裏側重於Apple提供的cheklist以及app在升級過程當中遇到的問題。ios
扁平化的設計已經「流傳」了好久,iOS7上標準控件(UIKit)有了翻天覆地的變化:按鈕沒有邊,狀態欄透明,導航欄變半透明,alert/progress/picker徹底是新的表現形式等等。固然,庫也更新了很多。印象最深的就是試圖控制器中view的尺寸是全屏:即view的尺寸是320×480,包含了頂部的status bar。這一點之因此深入,是由於以前作過view全屏和非全屏之間的切換。在iOS7裏,全屏應該更容易實現。 Apple推出xcode5後,有可能4在不久的未來不能再發布App。在最近這段時間須要說明的是:用xcode4打包的App在iOS7上運行除了alert/preogress等控件是iOS7的樣子,其餘仍是舊的形式。xcode
Apple宣稱iOS7的設計遵循三大主題:app
在(重)設計App前,還須要考慮:ide
ps:Apple彷佛只爲開發者「考慮」了ios6上App的升級,不知道還有不少地方的人還在爲4.3,5.x的系統奮鬥! 爲了更好的區分App類型,從使用控件的角度,Apple將App分紅三種類型:wordpress
標準型的話,須要作的修改可能相對少一點,可是由於iOS7的變化太大了,仍是會有「莫名」的問題:佈局
這些問題經過文檔都能比較容易的解決,標準型App升級主要遇到的是:佈局,對於交互方面的修改升級不會太大。 對於非標準型控件來講,我以爲最大的問題就是風格要和系統協調(說了句廢話)。這主要仍是設計師費神的事情了,我和設計師溝通的結果就是認爲App的配色須要好好修改,你們仁者見仁,智者見智吧。測試
如下就是Apple提供的cheklist。字體
從checklist能夠看出Apple此次推陳出新的力度很大,個人感受是之後的App最低只要適配iOS6,可是對於天朝不知道5.x以及之前的系統用戶佔比有多大了。還有,之後的開發必定要使用autolayout還有sb。在iOS7新建工程的模版裏已經沒有xib了,都是默認sb,還有都是默認ARC。動畫
Apple所指的實際上是支持ios7前的系統,只不過他「眼裏」如今只有ios6了。這裏列舉的方法,對於5.x的系統大部分也是使用的
在Assitantor模式下,xcode5提供給開發者ios7和ios7前兩種佈局,只要點擊preview(如圖),右下角能夠點擊切換
ios7引入了Asset Catalog來更好的管理圖片,這個會專門說。
這個之前版本升級的時候也遇到過,就是更新的時候有些API不用了,可是老系統裏還能使用,這時須要區分系統了。
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) { // Load resources for iOS 6.1 or earlier} else { // Load resources for iOS 7 or later}
這裏按照Apple文檔的脈絡,挑選那些我遇到的問題。
最主要變化就是view是320×480的尺寸。使用 wantsFullScreenLayout 的須要改過來,不然這個在iOS7上會有錯誤。下面分帶bar和不帶bar的情形,說一下layout須要注意的地方。
1帶有nav bar:
若是按以前的frame將y設置爲0,有可能subview會被bar擋住。若是要是subview加在bar底的話能夠經過設置:
self.edgesForExtendedLayout = UIRectEdgeNone;
這樣就能夠了,在viewDidAppear裏你能夠發現,view的frame已經去掉了bar佔用的高度了。
此外,iOS7中的nav bar默認是帶透明的。可是若是選擇了非透明的bar呢?這時,viewcontroller的view會默認去掉bar和statu bar的高度。可是這時,若是想讓view的尺寸全屏又該如何呢。這時只要設置:
self.extendedLayoutIncludesOpaqueBars = YES;
這個屬性的英文自己解釋得很到位了,就很少說了。
2不帶有nav bar:
這時statu bar不管如何都是佔據掉20的高度,因此subview的佈局須要計算在內。
此外,UIViewController還添加了automaticallyAdjustsScrollViewInsets, topLayoutGuide/bottomLayputGuide等屬性。有須要的能夠自行測試
ios6,bar的tintcolor使用tintColor;ios7則要使用barTintColor(ios7裏bar的tintcolor用於設置BarButtonitem)。對於支持多個iOS的App,須要區分。此外,UIView新添加了tintColor的屬性。若是給window設置tintcolor:
self.window.tintColor = [UIColor redColor];
那麼,nav bar上的按鈕顏色會變成紅色。若是view沒有設置這個屬性(一般爲nil),那麼默認使用父view的tintColor。對於頂層的window,tintColor是由系統定義的。須要提醒的是不能經過appearence的方式來設置tintColor。
聽說使用Dynamic Type後,能夠
在iOS7中,用戶能夠設置字體大小到本身認爲合適的地方。若是程序想響應這種變化的話:
UIContentSizeCategoryDidChangeNotification
Notificationios7新添了在runtime的時候,指定動做失敗的delegate。Apple舉例說明:系統自己有從下向上顯示控制中心的功能,那麼在App裏若是view也添加了這樣的手勢操做,那麼能夠在delegate裏動態設置爲nil從而先響應系統的。
Apple文檔中剩下的部分,詳細闡述了一些控件,control,和view的變化,文檔裏附有詳細的異同比較並有圖例。這裏就再也不一一贅述了。
我我的從中學到的:
2013-09-13