iOS 適配的幾種模式

1.尺寸適配
1.原因 iOS7中所有導(dǎo)航欄都為半透明钦勘,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不再單獨(dú)占用高度,即View的(0,0)坐標(biāo)是從屏幕左上角開始的复濒;而在iOS7之前的系統(tǒng)中殿衰,導(dǎo)航欄和狀態(tài)欄單獨(dú)占用高度弥奸,即View的(0,0)的坐標(biāo)從導(dǎo)航欄下面開始的。
解決方案:

1> 修改window的frame坐標(biāo)
這個(gè)思路是在iOS7系統(tǒng)里面把windows下拉20個(gè)pixel罐韩,這樣可以讓開status bar的位置憾赁,于是一切都恢復(fù)了正常。
好處是不用每個(gè)viewController來(lái)逐個(gè)修改散吵,一般在AppDelegate.m一個(gè)文件里面修改即可缠沈。壞處是現(xiàn)實(shí)比想象的殘酷,看起來(lái)簡(jiǎn)單方便的方法總有各種各樣的問(wèn)題错蝴,網(wǎng)上這樣做的也各種吐槽,多次努力沒(méi)結(jié)果后我也放棄了繼續(xù)鉆研颓芭。
2>. 手動(dòng)修改坐標(biāo)
這個(gè)方法對(duì)于不使用XIB文件的學(xué)院派極客是唯一的方法顷锰,也沒(méi)有任何問(wèn)題,就是工作量大亡问。另外官紫,對(duì)于使用IB來(lái)輔助做UI的應(yīng)用來(lái)說(shuō)就不太適合了。
3> 修改Delta值
作為蘋果公司來(lái)說(shuō)州藕,推出iOS7時(shí)顯然可以預(yù)計(jì)到這樣的困境束世,它也確實(shí)給大家提供了解決方案。這個(gè)方案是蘋果在官方文檔里面介紹過(guò)的方案床玻。
首先是選擇需要適配的IB文件毁涉,把Interface Builder Document里面的View as選擇成iOS 6.1 and Earlier。


圖片加載中...

這樣在IB里面各個(gè)控件都會(huì)變成iOS6的樣式锈死,但此時(shí)在iOS7上運(yùn)行系統(tǒng)仍然會(huì)用iOS7的控件來(lái)顯示贫堰,坐標(biāo)也仍然不正確——貌似一點(diǎn)作用都沒(méi)有。恩待牵,這只是第一步其屏,不用急,再做一步就可以實(shí)現(xiàn)適配了缨该!
修改DeltaY的值偎行,修改成什么值是根據(jù)你的實(shí)際情況定的,我這里顯然就是status bar的高度贰拿,20個(gè)pixel蛤袒。


圖片加載中...

2.如果使用設(shè)置frame ,bounds,里面的尺寸最好使用相對(duì)坐標(biāo),因?yàn)樵诓煌聊坏氖謾C(jī),如果使用絕對(duì)的坐標(biāo),在某些手機(jī)看來(lái),位置大小就不會(huì)那么協(xié)調(diào),最簡(jiǎn)單的是定義一個(gè)宏,WIDTH為屏幕寬度,HEIGHT是屏幕寬度

2,IOS版本差異
判斷版本號(hào),在高版本的手機(jī)上運(yùn)行低版本的方法,容易過(guò)期,過(guò)期與否,看官方API
使用高版本好的API,必須加上版本判斷,當(dāng)時(shí)低版本的手機(jī)時(shí),應(yīng)該有相應(yīng)同等功能的API

一、ios7及之前版本****膨更,universal程序準(zhǔn)備3套資源:普清(320×480)汗盘、高清(1136×768)、ipadhd(2048×1536)询一。其中隐孽,iPhone 4癌椿、iphone5、ipad普清(1024×768)使用同一套資源菱阵。即背景圖使用1136×768踢俄,資源圖完全相同,針對(duì)ipad晴及,使用如下代碼:
if([[UIDevicecurrentDevice]userInterfaceIdiom] ==UIUserInterfaceIdiomPad) {//只針對(duì)ipad使用該資源
[[CCFileUtils sharedFileUtils]setiPadSuffix:@"-hd"];//ipad使用-hd資源
}

二都办、針對(duì)ios8的適配
主要是Icon和launch image的操作。

在xcode工程中虑稼,command + N琳钉,——> iOS——》resource——》Asset Catalog。新建這樣一個(gè)文件蛛倦。
然后歌懒,在這個(gè)新建的xcassets文件中,在其左側(cè)欄右鍵溯壶,點(diǎn)擊new app icon會(huì)產(chǎn)生一個(gè)APPIcon文件夾及皂;new launch image,會(huì)新建1個(gè)LaunchImage文件夾且改。

這2個(gè)文件夾內(nèi)就是你所需要提供的icon和launch image了验烧。把你做好的icon和launch image放進(jìn)這2個(gè)文件夾,鼠標(biāo)拖曳到相應(yīng)的欄位即可又跛。

三碍拆、iphone6捣染、iPhone6 plus的資源使用

1龙致、iPhone6的圖片資源使用同iPhone5在张、iPhone4跌穗,坐標(biāo)調(diào)整最好使用autolayout.
-hd高清資源的背景圖統(tǒng)一調(diào)整為:1334×768募判,iPhone4土童、5汽煮、6以及非Retina的ipad都用這種尺寸的背景圖聊倔。其余-hd的assets圖片資源不變济丘,繼續(xù)沿用即可谱秽。

2、iPhone6 plus圖片資源使用ipadhd的資源摹迷。

具體操作:(1)在CCCConfiguration.m中疟赊,找到如下方法:-(NSInteger) runningDevice。
在此方法中找到這一行:ret = isiPhone5 ? CCDeviceiPhone5 : CCDeviceiPhone;

在這一行之下峡碉,if條件之外另起一行近哟,寫入:

if ([UIScreen mainScreen].scale == 3.0f) { //iPhone6 plus的特征
ret = CCDeviceiPhoneRetinaDisplay;

}//end if

這幾行代碼可以讓iPhone6 plus使用“-hd”高清資源。

(2)在appdelegate.m中鲫寄,applicationdidfinishlaunching中吉执,加入:

if (DEVICE_IS_IPHONE6Plus) {
if((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) && ([CCDirector sharedDirector].contentScaleFactor == 3))
{
[CCDirector sharedDirector].contentScaleFactor = ([CCDirector sharedDirector].viewSizeInPixels.width/1024);

}

[[CCFileUtils sharedFileUtils]setiPhoneRetinaDisplaySuffix:@"-ipadhd"];//iphone6 plus使用-ipadhd資源
}

(3)自行調(diào)節(jié)坐標(biāo)疯淫,以適應(yīng)iPhone6 plus就可以了。

四戳玫、圖標(biāo)icon上又出現(xiàn)了玻璃高光

在工程中選擇包含icon和launch image的images.xcassets文件夾熙掺,選擇Appicon,打開右側(cè)邊欄咕宿,勾選“iOS icon is pre-rendered”即可币绩,如下:

五、更新版本在iTunesconnect中上傳截圖府阀,規(guī)格尺寸都對(duì)缆镣,就是上傳失敗,出現(xiàn)如下提示:
One or more screenshots are in the wrong size. For more information, see the Developer Guide.

原因:上傳的是ios模擬器自動(dòng)生成的截圖试浙,截圖命名中有漢字董瞻。把截圖用簡(jiǎn)短的英文重命名即可。

六川队、上傳更新版本的app
出現(xiàn)如下問(wèn)題:

原因:
工程中asset catalog里面,APPIcon中有個(gè)carplay圖標(biāo)是120×120的睬澡,這個(gè)圖標(biāo)不應(yīng)該加上固额,將其刪除,再次上傳就ok了煞聪。

下面那個(gè)黃色警告可以無(wú)視斗躏。
IOS8

此次蘋果在2014 WWDC開發(fā)者大會(huì)上發(fā)布了全新一代操作系統(tǒng)iOS8。據(jù)了解昔脯,此次iOS8操作系統(tǒng)雖然和iOS7區(qū)別不打啄糙,但是蘋果注重的是內(nèi)在,iOS8添加了眾多新功能云稚。本文小編先為大家?guī)?lái)蘋果iOS8全部新功能詳細(xì)介紹 16大新功能隧饼。

圖片加載中...
一、支持第三方輸入法
蘋果的輸入法一直被人詬病静陈,而倒了iOS8蘋果終于開放第三方輸入法了燕雁。喜大普奔的更新!蘋果自己的漢字輸入法也加入了快速聯(lián)想功能,輸入更迅速鲸拥。
iMessage可發(fā)送語(yǔ)音和視頻
干掉微信的節(jié)奏?iMessage可以發(fā)送語(yǔ)音消息和視頻了拐格,而且體驗(yàn)與微信非常類似。
二刑赶、通知中心的革新
在鎖屏狀態(tài)下捏浊,用戶可以直接回復(fù)短信。
三撞叨、HealthKit健康平臺(tái)
第三方健康A(chǔ)pp應(yīng)用可以通過(guò)過(guò)此平臺(tái)來(lái)管理心率金踪、運(yùn)動(dòng)浊洞、飲食等健康數(shù)據(jù)。
四热康、Family Sharing家庭分享
一個(gè)人買的應(yīng)用或歌曲沛申,可以分享最多6名親屬使用,同時(shí)它還能控制兒童購(gòu)買應(yīng)用姐军。
五铁材、改進(jìn)Siri
Siri更加智能,并且增強(qiáng)了汽車內(nèi)Siri語(yǔ)音的體驗(yàn)奕锌。
六著觉、針對(duì)中國(guó)的優(yōu)化
iOS 8針對(duì)中國(guó)市場(chǎng)進(jìn)行了特殊優(yōu)化,比如準(zhǔn)確的中文導(dǎo)航和農(nóng)歷等惊暴。
七饼丘、改進(jìn)Spotlight搜索
Spotlight不再只是本地搜索,可以搜索互聯(lián)網(wǎng)內(nèi)容和應(yīng)用內(nèi)容
八辽话、改進(jìn)多任務(wù)界面
多任務(wù)切換界面上方加入最近聯(lián)系人
九肄鸽、強(qiáng)大的照片編輯功能
Mac、iOS設(shè)備可以同步進(jìn)行圖片編輯油啤,可以調(diào)整照片的曝光度典徘、對(duì)比度、亮度等參數(shù)益咬。更加強(qiáng)大
十逮诲、TouchID向第三方開放
第三方應(yīng)用可以使用TouchID接口,意味著未來(lái)的很多應(yīng)用都可以用指紋識(shí)別功能了幽告。
十一梅鹦、HomeKit智能家居功能
蘋果向智能家居開放的API,比如未來(lái)通過(guò)這個(gè)API可以實(shí)現(xiàn)iPhone控制門鎖冗锁,控制家庭燈光和電器開關(guān)等齐唆。
十二、相機(jī)對(duì)焦時(shí)可以自由調(diào)節(jié)進(jìn)光量
iOS8不僅為照片的后期處理加入了強(qiáng)大編輯功能冻河,內(nèi)置相機(jī)同樣增加了一項(xiàng)不可忽視的功能——自由調(diào)節(jié)進(jìn)光量蝶念,在拍攝中,觸摸屏幕對(duì)好焦點(diǎn)后芋绸,會(huì)在對(duì)焦框旁邊出現(xiàn)進(jìn)光量調(diào)節(jié)軸媒殉,能夠自由增加或降低拍攝的曝光量,再也不必因?yàn)楣獾膯?wèn)題頻繁找焦點(diǎn)測(cè)光了摔敛。
十三廷蓉、Safari新增DuckDuckGo搜索引擎
DuckDuckGo是來(lái)自于美國(guó)的一家小型搜索引擎商,其最大的特點(diǎn)是嚴(yán)格保護(hù)用戶的隱私,承諾不記錄不監(jiān)控用戶的搜索內(nèi)容桃犬,搜索內(nèi)容也更加的精準(zhǔn)刹悴。相信國(guó)內(nèi)用戶是不關(guān)心它的,不過(guò)有多一個(gè)好選擇也不錯(cuò)攒暇。[4]
十四土匀、監(jiān)測(cè)每款應(yīng)用的耗電量
iOS8還有一個(gè)隱藏較深的功能,在設(shè)置中打開電池用量菜單形用,用戶會(huì)發(fā)現(xiàn)近期使用過(guò)的APP的耗電百分比都在里面就轧,一目了然。經(jīng)過(guò)這樣的監(jiān)測(cè)田度,的確是相機(jī)最耗電!
十五妒御、盲文鍵盤
iOS8終于新增了盲文鍵盤。對(duì)于盲人來(lái)說(shuō)镇饺,這真的是個(gè)福音乎莉,這也將會(huì)對(duì)他們的生活產(chǎn)生巨大影響。[4]
十六奸笤、智能快捷按鈕
iOS8設(shè)備會(huì)根據(jù)位置惋啃,自動(dòng)在鎖屏界面左下角顯示相關(guān)應(yīng)用的快捷啟動(dòng)按鈕。在iOS8Beta1測(cè)試版中监右,蘋果利用iBeacon技術(shù)將基于地理位置的應(yīng)用通知推送到用戶iPhone或iPad的鎖屏界面上边灭,這些通知圖標(biāo)位于鎖屏界面左下方,用戶可以按住這個(gè)小圖標(biāo)向上滑動(dòng)解鎖設(shè)備打開該應(yīng)用秸侣。[5]
比如當(dāng)用戶拿著更新至iOS8的手機(jī)到星巴克咖啡店時(shí)存筏,星巴克的APP就會(huì)出現(xiàn)在鎖屏的左下角(與相機(jī)快捷鍵相對(duì)應(yīng))宠互,用戶按住它向上滑動(dòng)就可以直接啟動(dòng)APP味榛,與鎖屏啟動(dòng)相機(jī)APP一致。此外予跌,即使用戶沒(méi)有安裝某個(gè)應(yīng)用搏色,在特定地點(diǎn)時(shí),iOS 8也會(huì)向用戶推薦應(yīng)用券册,只是打開后會(huì)進(jìn)入App Store應(yīng)用安裝界面频轿。不過(guò)經(jīng)過(guò)測(cè)試似乎該功能目前還不夠完善。
IOS7iOS7最大的變化莫過(guò)于UI設(shè)計(jì)烁焙,也許你會(huì)說(shuō)UI設(shè)計(jì)“這是設(shè)計(jì)師大大們應(yīng)該關(guān)注的事情航邢,不關(guān)開發(fā)者的事,我們只需要替換圖片就行了”骄蝇。那你就錯(cuò)了膳殷。 UI的變化必然帶來(lái)使用習(xí)慣和方式的轉(zhuǎn)變,如何運(yùn)用iOS7的UI九火,如何是自己的應(yīng)用更切合新的系統(tǒng)赚窃,都是需要考慮的事情册招。另外值得注意的是,使用 iOS7 SDK(現(xiàn)在只有Xcode5預(yù)覽版提供)打包的應(yīng)用在iOS7上運(yùn)行時(shí)將會(huì)自動(dòng)使用iOS7的新界面勒极,所以原有應(yīng)用可能需要對(duì)新界面進(jìn)行重大調(diào)整是掰。具體 的iOS7中所使用的UI元素的人際交互界面文檔,可以從這里找到(應(yīng)該是需要開發(fā)者賬號(hào)才能看)辱匿。ios-7-logo簡(jiǎn)單總結(jié)來(lái)說(shuō)键痛,以現(xiàn)在上手體驗(yàn)看來(lái)新的UI變化改進(jìn)有如下幾點(diǎn):1.狀態(tài)欄,導(dǎo)航欄和應(yīng)用實(shí)際展示內(nèi)容不再界限:系統(tǒng)自帶的應(yīng)用都不再區(qū)分狀態(tài)欄和navigation bar掀鹅,而是用統(tǒng)一的顏色力求簡(jiǎn)潔散休。這也算是一種趨勢(shì)。2.BarItem的按鈕全部文字化:這點(diǎn)做的相當(dāng)堅(jiān)決乐尊,所有的導(dǎo)航和工具條按鈕都取消了擬物化戚丸,原來(lái)的文字(比如“Edit”,“Done”之類)改為了簡(jiǎn)單的文字扔嵌,原來(lái)的圖標(biāo)(比如新建或者刪除)也做了簡(jiǎn)化限府。3.程序打開加入了動(dòng)畫:從主界面到圖標(biāo)所在位置的一個(gè)放大,同時(shí)顯示應(yīng)用的載入界面痢缎。自己實(shí)驗(yàn)了幾個(gè)現(xiàn)有的AppStore應(yīng)用在iOS7上的運(yùn)行情況:1.Pomodoro Do: 這是我自己開發(fā)的應(yīng)用胁勺,運(yùn)行正常,但是因?yàn)椴皇莍OS7 SDK打包独旷,所以在UI上使用了之前系統(tǒng)的署穗,問(wèn)題是導(dǎo)航欄Tint顏色丟失,導(dǎo)致很難看嵌洼,需要盡快更新案疲。2.Facebook:因?yàn)槭褂昧藞D片自定義導(dǎo)航欄,而沒(méi)有直接使用系統(tǒng)提供的材質(zhì)麻养,所以沒(méi)什么問(wèn)題褐啡。3.面包旅行:直接Crash,無(wú)法打開鳖昌,原因未知备畦。這次UI大改可以說(shuō)是一次對(duì)敏捷開發(fā)的檢驗(yàn),原來(lái)的應(yīng)用(特別是擬物化用得比較重的應(yīng)用)雖然也能運(yùn)行许昨,但是很多UI自定義的地方需要更改不說(shuō)懂盐,還 容易讓用戶產(chǎn)生一種“來(lái)到了另一個(gè)世界”的感覺(jué),同時(shí)可以看到也有部分應(yīng)用無(wú)法運(yùn)行糕档。而對(duì)于蘋果的封閉系統(tǒng)和只升不降的特性莉恼,開發(fā)者以及其應(yīng)用必須要盡快 適應(yīng)這個(gè)新系統(tǒng),這對(duì)于迭代快速,還在繼續(xù)維護(hù)的應(yīng)用來(lái)說(shuō)會(huì)是一個(gè)機(jī)會(huì)类垫。相信誰(shuí)先能適應(yīng)新的UI司光,誰(shuí)就將在iOS7上占到先機(jī)。動(dòng)態(tài)UIKit新增了UIDynamicItem委托悉患,用來(lái)為UIView制定動(dòng)態(tài)行為残家,當(dāng)然其他任何對(duì)象都能通過(guò)實(shí)現(xiàn)這組接口來(lái)定義動(dòng)態(tài)行為,只不過(guò)在UIKit中可 能應(yīng)用最多售躁。所謂動(dòng)態(tài)行為坞淮,是指將現(xiàn)實(shí)世界的行為或者特性引入到UI中,比如重力等陪捷。通過(guò)實(shí)現(xiàn)UIDynamicItem回窘,UIKit現(xiàn)在支持如下行為: * UIAttachmentBehavior 連接兩個(gè)實(shí)現(xiàn)了UIDynamicItem的物體(以下簡(jiǎn)稱動(dòng)態(tài)物體),一個(gè)物體移動(dòng)時(shí)市袖,另一個(gè)跟隨移動(dòng) * UICollisionBehavior 指定邊界啡直,使兩個(gè)動(dòng)態(tài)物體可以進(jìn)行碰撞 * UIGravityBehavior 顧名思義,為動(dòng)態(tài)物體增加重力模擬 * UIPushBehavior 為動(dòng)態(tài)物體施加持續(xù)的力 * UISnapBehavior 為動(dòng)態(tài)物體指定一個(gè)附著點(diǎn)苍碟,想象一下類似掛一幅畫在圖釘上的感覺(jué)酒觅。如果有開發(fā)游戲的童鞋可能會(huì)覺(jué)得這些很多都是做游戲時(shí)候的需求,一種box2d之類的2D物理引擎的既視感躍然而出微峰。沒(méi)錯(cuò)的親舷丹,動(dòng)態(tài)UI,加上之后 要介紹的Sprite Kit蜓肆,極大的擴(kuò)展了使用UIKit進(jìn)行游戲開發(fā)的可能性颜凯。另外要注意UIDynamicItem不僅適用于UIKit,任何對(duì)象都可以實(shí)現(xiàn)接口來(lái)獲得動(dòng) 態(tài)物體的一些特性仗扬,所以說(shuō)用來(lái)做一些3D的事情也不是沒(méi)有可能症概。如果覺(jué)得Cocos2D+box2d這樣的組合使用起來(lái)不方便的話,現(xiàn)在動(dòng)態(tài) UIKit+SpriteKit給出了新的選擇厉颤。游戲方面iOS7 SDK極大加強(qiáng)了直接使用iOS SDK制作和分發(fā)游戲的體驗(yàn)穴豫,最主要的是引入了專門的游戲制作框架凡简。Sprite Kit Framework這是個(gè)人認(rèn)為iOS7 SDK最大的亮點(diǎn)逼友,也是最重要的部分,iOS SDK終于有自己的精靈系統(tǒng)了秤涩。Sprite Kit Framework使用硬件加速的動(dòng)畫系統(tǒng)來(lái)表現(xiàn)2D和2.5D的游戲帜乞,它提供了制作游戲所需要的大部分的工具,包括圖像渲染筐眷,動(dòng)畫系統(tǒng)黎烈,聲音播放以及圖 像模擬的物理引擎。可以說(shuō)這個(gè)框架是iOS SDK自帶了一個(gè)較完備的2D游戲引擎照棋,力圖讓開發(fā)者專注于更高層的實(shí)現(xiàn)和內(nèi)容资溃。和大多數(shù)游戲引擎一樣,Sprite Kit內(nèi)的內(nèi)容都按照?qǐng)鼍埃⊿cene)來(lái)分開組織烈炭,一個(gè)場(chǎng)景可以包括貼圖對(duì)象溶锭,視頻,形狀符隙,粒子效果甚至是CoreImage濾鏡等等趴捅。相對(duì)于現(xiàn)有的 2D引擎來(lái)說(shuō),由于Sprite Kit是在系統(tǒng)層級(jí)進(jìn)行的優(yōu)化霹疫,渲染時(shí)間等都由框架決定拱绑,因此應(yīng)該會(huì)有比較高的效率。另外丽蝎,Xcode還提供了創(chuàng)建粒子系統(tǒng)和貼圖Atlas的工具猎拨。使用Xcode來(lái)管理粒子效果和貼圖atlas,可以迅速在Sprite Kit中反應(yīng)出來(lái)屠阻。Game Controller Framework為Made-for-iPhone/iPod/iPad (MFi) game controller設(shè)計(jì)的硬件的對(duì)應(yīng)的框架迟几,可以讓用戶用來(lái)連接和控制專門的游戲硬件。參考WWDC 2013開場(chǎng)視頻中開始的賽車演示±赴剩現(xiàn)在想到的是类腮,也許這貨不僅可以用于游戲…或者蘋果之后會(huì)擴(kuò)展其應(yīng)用,因?yàn)槭褂闷占奥屎芨叩膇Phone作為物聯(lián)網(wǎng)的 入口蛉加,似乎會(huì)是很有前途的事情蚜枢。GameCenter改進(jìn)GameCenter一直是蘋果的敗筆…雖然每年都在改進(jìn),但是一直沒(méi)看到大的起色针饥。今年也不例外厂抽,都是些小改動(dòng),不提也罷丁眼。多任務(wù)強(qiáng)化經(jīng)常需要下載新內(nèi)容的應(yīng)用現(xiàn)在可以通過(guò)設(shè)置UIBackgroundModes為fetch來(lái)實(shí)現(xiàn)后臺(tái)下載內(nèi)容了筷凤,需要在AppDelegate里實(shí)現(xiàn)setMinimumBackgroundFetchInterval:以及application:performFetchWithCompletionHandler:來(lái)處理完成的下載,這個(gè)為后臺(tái)運(yùn)行代碼提供了又一種選擇苞七。不過(guò)考慮到Apple如果繼續(xù)嚴(yán)格審核的話藐守,可能只有雜志報(bào)刊類應(yīng)用能夠取得這個(gè)權(quán)限吧。另外需要注意開發(fā)者僅只能指定一個(gè)最小間隔蹂风,最后下沒(méi)下估計(jì)就得看系統(tǒng)娘的心情了卢厂。同樣是后臺(tái)下載,以前只能推送提醒用戶進(jìn)入應(yīng)用下載惠啄,現(xiàn)在可以接到推送并在后臺(tái)下載慎恒。UIBackgroundModes設(shè)為remote-notification任内,并實(shí)現(xiàn)application:didReceiveRemoteNotification:fetchCompletionHandler:為后臺(tái)下載,開發(fā)者必須使用一個(gè)新的類NSURLSession融柬,其實(shí)就是在NSURLConnection上加了個(gè)后臺(tái)處理死嗦,使用類似,API十分簡(jiǎn)單粒氧,不再贅述越走。AirDrop這個(gè)是iOS7的重頭新功能,用戶可以用它來(lái)分享照片靠欢,文檔廊敌,鏈接,或者其他數(shù)據(jù)給附近的設(shè)備门怪。但是不需要特別的實(shí)現(xiàn)骡澈,被集成在了標(biāo)準(zhǔn)的 UIActivityViewController里,并沒(méi)有單獨(dú)的API提供掷空。數(shù)據(jù)的話肋殴,可以通過(guò)實(shí)現(xiàn)UIActivityItemSource接口后 進(jìn)行發(fā)送。大概蘋果也不愿意看到超出他們控制的文件分享功能吧坦弟,畢竟這和iOS設(shè)計(jì)的初衷不一樣护锤。如果你不使用 UIActivityViewController的話,可能是無(wú)法在應(yīng)用里實(shí)裝AirDrop功能了酿傍。地圖Apple在繼續(xù)在地圖應(yīng)用上的探索烙懦,MapKit的改進(jìn)也乏善可陳。我一直相信地圖類應(yīng)用的瓶頸一定在于數(shù)據(jù)赤炒,但是對(duì)于數(shù)據(jù)源的建立并不是一年兩年能夠完成的氯析。Google在這一塊憑借自己的搜索引擎有著得天獨(dú)厚的優(yōu)勢(shì),蘋果還差的很遠(yuǎn)很遠(yuǎn)莺褒⊙诨海看看有哪些新東西吧:1.MKMapCamera,可以將一個(gè)MKMapCamera對(duì)象添加到地圖上遵岩,在指明位置你辣,角度和方向后將呈現(xiàn)3D的樣子…大概可以想象成一個(gè)數(shù)字版的Google街景..2.MKDirections 獲取Apple提供的基于方向的路徑,然后可以用來(lái)將路徑繪制在自己的應(yīng)用中尘执。這可能對(duì)一些小的地圖服務(wù)提供商產(chǎn)生沖擊舍哄,但是還是那句話,地圖是一個(gè)數(shù)據(jù) 的世界正卧,在擁有完備數(shù)據(jù)之前蠢熄,Apple不是Google的對(duì)手跪解。這個(gè)狀況至少會(huì)持續(xù)好幾年(也有可能是永遠(yuǎn))炉旷。3.MKGeodesicPolyline 創(chuàng)建一個(gè)隨地球曲率的線签孔,并附加到地圖上,完成一些視覺(jué)效果窘行。4.MKMapSnapshotter 使用其拍攝基于地圖的照片饥追,也許各類簽到類應(yīng)用會(huì)用到。5.改變了overlay物件的渲染方式罐盔。Inter-App Audio 應(yīng)用間的音頻AudioUnit框架中加入了在同一臺(tái)設(shè)備不同應(yīng)用之間發(fā)送MIDI指令和傳送音頻的能力但绕。比如在一個(gè)應(yīng)用中使用AudioUnit錄音,然后在另一個(gè) 應(yīng)用中打開以處理等惶看。在音源應(yīng)用中聲明一個(gè)AURemoteIO實(shí)例來(lái)標(biāo)為Inter-App可用捏顺,在目標(biāo)應(yīng)用中使用新的發(fā)現(xiàn)接口來(lái)發(fā)現(xiàn)并獲取音頻。 想法很好纬黎,也算是在應(yīng)用內(nèi)共享邁出了一步幅骄,不過(guò)我對(duì)現(xiàn)在使用AudioUnit這樣的低層級(jí)框架的應(yīng)用數(shù)量表示不樂(lè)觀。也許今后會(huì)有一些為更高層級(jí)設(shè)計(jì)的 共享API提供給開發(fā)者使用本今。畢竟要從AudioUnit開始處理音頻對(duì)于大多數(shù)開發(fā)者來(lái)說(shuō)并不是一件很容易的事情拆座。點(diǎn)對(duì)點(diǎn)連接 Peer-to-Peer Connectivity可以看成是AirDrop不能直接使用的補(bǔ)償,代價(jià)是需要自己實(shí)現(xiàn)冠息。MultipeerConnectivity框架可以用來(lái)發(fā)現(xiàn)和連接附近的設(shè)備挪凑,并傳 輸數(shù)據(jù),而這一切并不需要有網(wǎng)絡(luò)連接逛艰□锾迹可以看到Apple逐漸在文件共享方面一步步放開限制,但是當(dāng)然所有這些都還是被限制在sandbox里的散怖。Store Kit FrameworkStore Kit在內(nèi)購(gòu)方面采用了新的訂單系統(tǒng)唐断,這將可以實(shí)現(xiàn)對(duì)訂單的本機(jī)驗(yàn)證。這是一次對(duì)應(yīng)內(nèi)購(gòu)破解和有可能驗(yàn)證失敗導(dǎo)致內(nèi)購(gòu)失敗的更新杭抠,蘋果希望藉此減少內(nèi)購(gòu)的 實(shí)現(xiàn)流程脸甘,減少出錯(cuò),同時(shí)遏制內(nèi)購(gòu)破解泛濫偏灿。前者可能沒(méi)有問(wèn)題丹诀,但是后者的話,因?yàn)閛bjc的動(dòng)態(tài)特性翁垂,決定了只要有越獄存在铆遭,內(nèi)購(gòu)破解也是早晚的事情。 不過(guò)這一點(diǎn)確實(shí)方便了沒(méi)有能力架設(shè)驗(yàn)證服務(wù)器的小開發(fā)者沿猜,這方面來(lái)說(shuō)還是很好的枚荣。最后當(dāng)然還有一些其他小改動(dòng),包括MessageUI里添加了附件按鈕啼肩,Xcode開始支持模塊了等等橄妆。完整的iOS7新特性列表可以在這里找到(暫時(shí) 應(yīng)該也需要開發(fā)者賬號(hào))衙伶。最后一個(gè)好消息是,蘋果放慢了廢棄API的速度害碾,這個(gè)版本并沒(méi)有特別重要的API被標(biāo)為Deprecated矢劲,Cheers。
3.XCODE SDK的適配
圖片加載中...
Xcode 6 引入了設(shè)計(jì)和構(gòu)建軟件的嶄新方式慌随。Swift 是一種面向 Cocoa 和 Cocoa Touch 的創(chuàng)新編程語(yǔ)言芬沉,與 Xcode 工具相結(jié)合后,可以讓編程變得輕松愉悅阁猜。這一生動(dòng)體驗(yàn)滲透到了 Xcode 6 的方方面面丸逸。Interface Builder 的實(shí)時(shí)渲染功能,能將你手動(dòng)編寫的 UI 代碼顯示在設(shè)計(jì)畫布中剃袍,并即時(shí)反映你在代碼中輸入的變化椭员。全新的視圖調(diào)試器將所有 UI 圖層迸發(fā)為 3D 視覺(jué)化呈現(xiàn),讓你輕松了解界面的構(gòu)成方式笛园,識(shí)別重疊或截?cái)嗟囊晥D隘击。觀看“Xcode 6 的新特性”視頻 SwiftXcode 6 對(duì) Swift 有著全面深入的支持。你可以利用 100% Swift 代碼創(chuàng)建全新的 app研铆,或者將新的 Swift 代碼或框架添加到現(xiàn)有的 app 中埋同,還可查看用 Swift 和/或 Objective-C 語(yǔ)言編寫的文檔】煤欤“跳轉(zhuǎn)至定義”或“快速打開”等所有常見的可供性同樣適用于 Swift凶赁,甚至還可用 Swift 語(yǔ)法顯示 Objective-C 標(biāo)頭定義。詳細(xì)了解 Swift 編程語(yǔ)言 Playground盡管 Swift 編譯為高度優(yōu)化的原生代碼逆甜,但 Playground 可以實(shí)現(xiàn)腳本語(yǔ)言的交互式體驗(yàn)虱肄。鍵入一行代碼劫樟,結(jié)果便會(huì)立即顯現(xiàn)藤抡。如果你的代碼運(yùn)行一個(gè)循環(huán),可將該行代碼添加到時(shí)間軸輔助編輯器中撤卢,觀察其進(jìn)度素征。以圖形方式顯示變量集嵌,繪制視圖時(shí)檢查每一個(gè)步驟,或者觀看 SpriteKit 動(dòng)畫場(chǎng)景御毅。在 Playground 中優(yōu)化好代碼后根欧,即可將它移到你的項(xiàng)目中。Playground 文檔包括你可以在 Playground 中打開的教程端蛆,其中包含可供試驗(yàn)的交互式工作表凤粗。 命令行Xcode 調(diào)試器包含 Swift 語(yǔ)言的交互式版本,它稱為 REPL (Read-Eval-Print-Loop)今豆。使用 Swift 語(yǔ)法來(lái)評(píng)估你的現(xiàn)有 app 并與之交互嫌拣,或者在腳本式環(huán)境中編寫新的代碼柔袁。REPL 既可在 Xcode 控制臺(tái)的 LLDB 中使用,也可通過(guò)“終端”調(diào)用亭罪。 實(shí)時(shí)渲染Interface Builder 現(xiàn)可在設(shè)計(jì)時(shí)顯示你的自定義對(duì)象瘦馍,就如它們?cè)谀愕?app 運(yùn)行時(shí)的那樣歼秽。當(dāng)你更新自定義視圖的代碼時(shí)应役,Interface Builder 設(shè)計(jì)畫布可以自動(dòng)更新為新的外觀,無(wú)需執(zhí)行生成和運(yùn)行燥筷。你可以利用 API 添加屬性到 IB 檢查器中箩祥,為你的視圖快速更改設(shè)計(jì)時(shí)間,甚至還可以使用示例數(shù)據(jù)預(yù)填充視圖肆氓,以便對(duì)界面有更加精確的了解袍祖。 適用于 iOS 的 Storyboard 支持 UIKit 尺寸類,因此你可以開發(fā)一個(gè)可在任何 iOS 設(shè)備上正確運(yùn)作的通用 Storyboard谢揪。為特定設(shè)備尺寸或方向挑選特有的行為蕉陋,同時(shí)使界面的大部分元素保持一致、易于維護(hù)拨扶。Interface Builder 可以在你設(shè)計(jì)界面時(shí)預(yù)覽任何設(shè)備與方向的組合凳鬓。 視圖調(diào)試調(diào)試 app 的 UI 現(xiàn)在非常簡(jiǎn)單,只需點(diǎn)按一下就能將暫停的 app UI 迸發(fā)為各個(gè)圖層構(gòu)成的 3D 渲染患民,并在視圖堆棧中進(jìn)行查看缩举。輕松發(fā)現(xiàn)視圖可能被截?cái)嗷螂[藏的原因,并在檢查器中檢查和調(diào)試各種限制和其他屬性匹颤。若要修復(fù)問(wèn)題仅孩,選擇一個(gè)視圖即可快速跳轉(zhuǎn)到相關(guān)的代碼。 Xcode 6 還包含其他新的調(diào)試工具印蓖,如用于監(jiān)控 I/O 使用量的調(diào)試儀表和功能增強(qiáng)的 iCloud 儀表等辽慕。調(diào)試導(dǎo)航器甚至還能顯示更多有用的信息,如記錄的堆棧幀和隊(duì)列中的塊等赦肃。
圖片加載中...
性能測(cè)試XCTest 框架現(xiàn)已擴(kuò)展為支持性能測(cè)試鼻百,而且已完全集成到 Xcode 和 Xcode Server 中。Xcode 將運(yùn)行性能測(cè)試摆尝,并讓你定義基準(zhǔn)性能標(biāo)準(zhǔn)温艇。隨后的每一項(xiàng)測(cè)試將比較性能,顯示隨時(shí)間的變化堕汞,并提醒你代碼執(zhí)行可能帶來(lái)的性能驟降勺爱。性能測(cè)試已緊密集成到 Xcode 的全新日志 UI 中,該 UI 可以在測(cè)試結(jié)果變化時(shí)清楚地顯示出來(lái)讯检,在你監(jiān)控 app 的質(zhì)量時(shí)提醒你性能或功能下降琐鲁。 各種工具的外觀和工作方式更像是 Xcode卫旱。所記錄數(shù)據(jù)的軌跡被賦予更多空間,并在統(tǒng)一的檢查器區(qū)域中管理有關(guān)數(shù)據(jù)收集與查看方式的配置围段。工具甚至可以描述 XCTest顾翼。 更多功能 適用于 OS X 的 StoryboardStoryboard 現(xiàn)已加入到 OS X 中,其充分利用了 AppKit 中的 View Controller API奈泪∈拭常快速銜接多個(gè)視圖,定義包含關(guān)系和動(dòng)畫涝桅,而不必編寫代碼拜姿。適用于 OS X 的 Storyboard 提倡使用遵循 Mac 標(biāo)準(zhǔn)的界面,以使 app 的操作方式符合用戶的期望冯遂。 擴(kuò)展和框架iOS 開發(fā)者現(xiàn)在可以創(chuàng)建動(dòng)態(tài)框架蕊肥,就如在 OS X 上一樣「蚣。框架是一種代碼和資源的集合壁却,對(duì)功能進(jìn)行封裝,這項(xiàng)特性在多個(gè)項(xiàng)目中很有價(jià)值裸准≌苟框架與擴(kuò)展相輔相成,兩者共享的邏輯可由主 app 和捆綁擴(kuò)展使用狼速。 游戲構(gòu)建Xcode 包含一個(gè) SpriteKit 關(guān)卡設(shè)計(jì)器 SceneKit Support琅锻,支持粒子編輯器中的新特性。這讓創(chuàng)建 iOS 版和 OS X 版游戲變得前所未有的簡(jiǎn)單向胡。 本地化Xcode 6 中的本地化現(xiàn)已進(jìn)行了徹底升級(jí)恼蓬。基礎(chǔ) .strings 文件現(xiàn)在會(huì)從你的代碼自動(dòng)生成僵芹。通過(guò) Preview Assistant 查看你的 app 在不同語(yǔ)言中的外觀处硬,或者使用 iOS Simulator 模擬在其他語(yǔ)言環(huán)境中啟動(dòng)你的 app。當(dāng)內(nèi)容準(zhǔn)備就緒時(shí)拇派,Xcode 可以輕松導(dǎo)出和導(dǎo)入業(yè)界通用的 .XLIFF 格式荷辕。 Xcode Server在 OS X Server 上運(yùn)行的 Bot 支持的觸發(fā)器可根據(jù)規(guī)則運(yùn)行自定義腳本,還有更多選項(xiàng)可用于設(shè)置運(yùn)行集成的間隔件豌。此外疮方,Bot 可以通過(guò)分組來(lái)共享配置。iOS Simulator 配置使得創(chuàng)建獨(dú)特測(cè)試情景變得輕而易舉茧彤,尤其是通過(guò) Xcode Server 運(yùn)行時(shí)4.UI布局方式
絕對(duì)布局和相對(duì)布局
純代碼和xib和storyboard

autosizing

對(duì)于IOS的app開發(fā)者來(lái)說(shuō)骡显,不會(huì)像Android開發(fā)者一樣為很多的屏幕尺寸來(lái)做界面適配,因此硬編碼的坐標(biāo)也能工作良好,但是從設(shè)計(jì)模式上來(lái)說(shuō)這不是好的做法惫谤。而且也還有一些問(wèn)題壁顶,如iPhone5的適配,橫豎屏的切換等溜歪∪糇ǎ或許你可以做兩套UI方案來(lái)做適配,但是這樣增加重復(fù)工作量蝴猪,而且不夠高端调衰,萬(wàn)一有出新的屏幕大小了呢。哲理就將介紹IOS中的兩大自動(dòng)布局利器:Autoresizing
和Autolayout
拯腮。 autoresizing是UIView的屬性窖式,一直都有蚁飒,使用簡(jiǎn)單动壤,但是沒(méi)有autolayout強(qiáng)大。autolayout是IOS6以后的新技術(shù)淮逻,更加強(qiáng)大琼懊。本文主要介紹Autoresizing
的特性和用法。

  1. Autoresizing特性
    當(dāng)UIView
    的autoresizesSubviews
    是YES
    時(shí)爬早,(默認(rèn)是YES), 那么在其中的子view會(huì)根據(jù)它自身的autoresizingMask
    屬性來(lái)自動(dòng)適應(yīng)其與superView
    之間的位置和大小哼丈。
    autoresizingMask
    是一個(gè)枚舉類型, 默認(rèn)是UIViewAutoresizingNone
    , 也就是不會(huì)autoresize:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

1
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

2
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

3
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

4
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

5
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

6
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

7
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

8
</span>

<span
class
=
"line-number"
style=
"margin: 0px; padding: 0px;"

9
</span>

?
1

<code
class
=
"objc"

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone =
0
, UIViewAutoresizingFlexibleLeftMargin =
1
<<
0
, UIViewAutoresizingFlexibleWidth =
1
<<
1
, UIViewAutoresizingFlexibleRightMargin =
1
<<
2
, UIViewAutoresizingFlexibleTopMargin =
1
<<
3
, UIViewAutoresizingFlexibleHeight =
1
<<
4
, UIViewAutoresizingFlexibleBottomMargin =
1
<<
5
}; </code>

這個(gè)枚舉類型,使用了1 << n
這樣的寫法來(lái)定義醉旦,代表了它可以復(fù)選。如果你不明白為什么桨啃,可以復(fù)習(xí)下“位運(yùn)算”车胡。 那么這些值分別代表什么意思呢?
其實(shí)如何理解這幾個(gè)值很簡(jiǎn)單照瘾,那就是從xib里面看匈棘。 我們?cè)谝粋€(gè)xib文件中,取消勾選autolayout
析命,(默認(rèn)使用autolayout時(shí)主卫,autoresizing看不到)。那么我們可以在布局那一欄看到如何設(shè)置autoresizing
.
![](http://upload-images.jianshu.io/upload_images/1663804-2587b26da6a86077.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上圖說(shuō)明了在xib中設(shè)置的這些線條和實(shí)際屬性對(duì)應(yīng)的關(guān)系鹃愤,這其中需要注意的是簇搅,其中4個(gè)margin虛線才代表設(shè)置了該值,而width和height是實(shí)線代表設(shè)置了該值软吐,不能想當(dāng)然的理解瘩将。
這些項(xiàng)分別代表:

autoresizingMask是子視圖的左、右、上鸟蟹、下邊距以及寬度和高度相對(duì)于父視圖按比例變化乌妙,例如:

UIViewAutoresizingNone 不自動(dòng)調(diào)整。
UIViewAutoresizingFlexibleLeftMargin 自動(dòng)按比例調(diào)整與superView左邊的距離建钥,且與superView右邊的距離不變藤韵。
UIViewAutoresizingFlexibleRightMargin 自動(dòng)按比例調(diào)整與superView的右邊距離,且與superView左邊的距離不變熊经。
UIViewAutoresizingFlexibleTopMargin 自動(dòng)按比例調(diào)整與superView的頂部距離泽艘,且與superView底部的距離不變。
UIViewAutoresizingFlexibleBottomMargin自動(dòng)按比例調(diào)整與superView的底部距離镐依,且與superView頂部的距離不變匹涮。
UIViewAutoresizingFlexibleWidth自動(dòng)按比例調(diào)整寬度。
UIViewAutoresizingFlexibleHeight自動(dòng)按比例調(diào)整高度槐壳。
UILabellabel = [[UILabelalloc]initWithFrame:CGRectMake(50,100,200,40)];
[labelsetAutoresizingMask:UIViewAutoresizingNone]; 控件相對(duì)于父視圖坐標(biāo)值不變
CGRectMake(50,100,200,40)UIViewAutoresizingFlexibleWidth:控件的寬度隨著父視圖的寬度按比例改變 例如label寬度為 100 屏幕的寬度為320 當(dāng)屏幕寬度為480時(shí) label寬度 變?yōu)?100
480/320 以上這些都較易理解, 但是autoresizing
還有一些組合場(chǎng)景然低。那就是組合使用的場(chǎng)景。
autoresizingMask
說(shuō)明
xib預(yù)覽效果

None
view的frame不會(huì)隨superview的改變而改變(右圖的xib中預(yù)覽效果與實(shí)際效果有差务唐,實(shí)際效果是view的上邊距不變)
![](http://upload-images.jianshu.io/upload_images/1663804-60bd37fb3b7ef304.gif?imageMogr2/auto-orient/strip)

TopMargin | BottomMargin
view與其superView的上邊距和下邊距的比例維持不變
![](http://upload-images.jianshu.io/upload_images/1663804-783aecc927814a5c.gif?imageMogr2/auto-orient/strip)

LeftMargin | RightMargin
view與其superView的左邊距和右邊距的比例維持不變(右圖的xib中預(yù)覽效果與實(shí)際效果有差雳攘,實(shí)際效果是view的上邊距不變)
![](http://upload-images.jianshu.io/upload_images/1663804-4bb2d34044c67c41.gif?imageMogr2/auto-orient/strip)

LeftMargin | RightMargin | TopMargin | BottomMargin
view與其superView的上下左右邊距的比例維持不變
![](http://upload-images.jianshu.io/upload_images/1663804-2ea0fcf44e4811d3.gif?imageMogr2/auto-orient/strip)

LeftMargin | Width
view與其superView的右邊距的比例維持不變, 左邊距和width按比例調(diào)整(右圖的xib中預(yù)覽效果與實(shí)際效果有差,實(shí)際效果是view的上邊距不變)
![](http://upload-images.jianshu.io/upload_images/1663804-2347569b4969f7f2.gif?imageMogr2/auto-orient/strip)

LeftMargin | Width | RightMargin
左邊距枫笛、右邊距吨灭、寬按比例調(diào)整,(右圖的xib中預(yù)覽效果與實(shí)際效果有差刑巧,實(shí)際效果是view的上邊距不變)垂直方向是同樣效果喧兄,故不列舉
![](http://upload-images.jianshu.io/upload_images/1663804-558ba8dddf3cae53.gif?imageMogr2/auto-orient/strip)

Width | Height
自動(dòng)調(diào)整view的寬和高,保證上下左右邊距不變啊楚。如把tableView設(shè)置為此屬性吠冤,那么無(wú)論viewController的view是多大,都能自動(dòng)鋪滿
![](http://upload-images.jianshu.io/upload_images/1663804-18540367c32ba0a0.gif?imageMogr2/auto-orient/strip)

上面并未列舉所有組合場(chǎng)景特幔,但是已經(jīng)足夠我們理解autoresizing
了咨演。

  1. 小結(jié)
    Autoreszing的最常見的實(shí)用場(chǎng)景就是iPhone5的兼容了。比如我們想要設(shè)置tableView的frame蚯斯,那我們只需要在初始化設(shè)置frame之后將tableView的autoresizingMask設(shè)置為UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight
    就行了薄风。
    另一種比如我們想要一個(gè)view一直停留在其superview的最下方,那么我們?cè)诔跏蓟O(shè)置frame之后只需要將autoresizingMask設(shè)置為UIViewAutoresizingFlexibleTopMargin
    就可以了拍嵌。
    autorezingMask簡(jiǎn)單的一個(gè)屬性遭赂,理解它之后可以讓很多事情變得簡(jiǎn)單。
    AutoLayout

AutoLayout是什么横辆?
使用一句Apple的官方定義的話AutoLayout是一種基于約束的撇他,描述性的布局系統(tǒng)。Auto Layout Is a Constraint-Based, Descriptive Layout System.

關(guān)鍵詞:基于約束 - 和以往定義frame的位置和尺寸不同,AutoLayout的位置確定是以所謂相對(duì)位置的約束來(lái)定義的困肩,比如x坐標(biāo)為superView的中心划纽,y坐標(biāo)為屏幕底部上方10像素等描述性 - 約束的定義和各個(gè)view的關(guān)系使用接近自然語(yǔ)言或者可視化語(yǔ)言(稍后會(huì)提到)的方法來(lái)進(jìn)行描述布局系統(tǒng) - 即字面意思,用來(lái)負(fù)責(zé)界面的各個(gè)元素的位置锌畸。 總而言之勇劣,AutoLayout為開發(fā)者提供了一種不同于傳統(tǒng)對(duì)于UI元素位置指定的布局方法。以前潭枣,不論是在IB里拖放比默,還是在代碼中寫,每個(gè)UIView都會(huì)有自己的frame屬性盆犁,來(lái)定義其在當(dāng)前視圖中的位置和尺寸命咐。使用AutoLayout的話,就變?yōu)榱耸褂眉s束條件來(lái)定義view的位置和尺寸谐岁。這樣的 最大好處是一舉解決了不同分辨率和屏幕尺寸下view的適配問(wèn)題醋奠,另外也簡(jiǎn)化了旋轉(zhuǎn)時(shí)view的位置的定義,原來(lái)在底部之上10像素居中的view翰铡,不論在旋轉(zhuǎn)屏幕或是更換設(shè)備(iPad或者iPhone5或者以后可能出現(xiàn)的mini iPad)的時(shí)候钝域,始終還在底部之上10像素居中的位置讽坏,不會(huì)發(fā)生變化锭魔。總結(jié)使用約束條件來(lái)描述布局路呜,view的frame會(huì)依據(jù)這些約束來(lái)進(jìn)行計(jì)算Describe the layout with constraints, and frames are calculated automatically.

AutoLayout和Autoresizing Mask的區(qū)別
Autoresizing Mask是我們的老朋友了…如果你以前一直是代碼寫UI的話迷捧,你肯定寫過(guò)UIViewAutoresizingFlexibleWidth之類的枚舉;如果你以前用IB比較多的話胀葱,一定注意到過(guò)每個(gè)view的size inspector中都有一個(gè)紅色線條的Autoresizing的指示器和相應(yīng)的動(dòng)畫縮放的示意圖漠秋,這就是Autoresizing Mask。在iOS6之前抵屿,關(guān)于屏幕旋轉(zhuǎn)的適配和iPhone庆锦,iPad屏幕的自動(dòng)適配,基本都是由Autoresizing Mask來(lái)完成的轧葛。但是隨著大家對(duì)iOS app的要求越來(lái)越高搂抒,以及已經(jīng)以及今后可能出現(xiàn)的多種屏幕和分辨率的設(shè)備來(lái)說(shuō),Autoresizing Mask顯得有些落伍和遲鈍了尿扯。AutoLayout可以完成所有原來(lái)Autoresizing Mask能完成的工作求晶,同時(shí)還能夠勝任一些原來(lái)無(wú)法完成的任務(wù),其中包括:AutoLayout可以指定任意兩個(gè)view的相對(duì)位置衷笋,而不需要像Autoresizing Mask那樣需要兩個(gè)view在直系的view hierarchy中芳杏。AutoLayout不必須指定相等關(guān)系的約束,它可以指定非相等約束(大于或者小于等);而Autoresizing Mask所能做的布局只能是相等條件的爵赵。AutoLayout可以指定約束的優(yōu)先級(jí)吝秕,計(jì)算frame時(shí)將優(yōu)先按照滿足優(yōu)先級(jí)高的條件進(jìn)行計(jì)算。 總結(jié)Autoresizing Mask是AutoLayout的子集空幻,任何可以用Autoresizing Mask完成的工作都可以用AutoLayout完成郭膛。AutoLayout還具備一些Autoresizing Mask不具備的優(yōu)良特性,以幫助我們更方便地構(gòu)建界面氛悬。
AutoLayout基本使用方法
Interface Builder

最簡(jiǎn)單的使用方法是在IB中直接拖则剃。在IB中任意一個(gè)view的File inspector下面,都有Use Autolayout的選擇框(沒(méi)有的同學(xué)可以考慮升級(jí)一下Xcode了=如捅。=)棍现,鉤上,然后按照平常那樣拖控件就可以了镜遣。拖動(dòng)控件后在左邊的view hierarchy欄中會(huì)出現(xiàn)Constraints一向己肮,其中就是所有的約束條件。

圖片加載中...

選中某個(gè)約束條件后悲关,在右邊的Attributes inspector中可以更改約束的條件谎僻,距離值和優(yōu)先度等:
圖片加載中...

對(duì)于沒(méi)有自動(dòng)添加的約束,可以在IB中手動(dòng)添加寓辱。選擇需要添加約束的view艘绍,點(diǎn)擊菜單的Edit->Pin里的需要的選項(xiàng),或者是點(diǎn)擊IB主視圖右下角的
圖片加載中...
按鈕秫筏,即可添加格外的約束條件诱鞠。可視化的添加不僅很方便直觀这敬,而且基本不會(huì)出錯(cuò)航夺,是優(yōu)先推薦的添加約束的方式。但是有時(shí)候只靠IB是無(wú)法完成某些約束的添加的(比如跨view hierarchy的約束)崔涂,有時(shí)候IB添加的約束不能滿足要求阳掐,這時(shí)就需要使用約束的API進(jìn)行補(bǔ)充。手動(dòng)使用API添加約束
創(chuàng)建
iOS6中新加入了一個(gè)類:NSLayoutConstraint冷蚂,一個(gè)形如這樣的約束item1.attribute = multiplier ? item2.attribute + constant 對(duì)應(yīng)的代碼為[csharp]view plaincopy 1[NSLayoutConstraintconstraintWithItem:button
2attribute:NSLayoutAttributeBottom
3relatedBy:NSLayoutRelationEqual
4toItem:superview
5attribute:NSLayoutAttributeBottom
6multiplier:1.0
7constant:-padding]

這對(duì)應(yīng)的約束是“button的底部(y) = superview的底部 -10”缭保。在創(chuàng)建約束之后,需要將其添加到作用的view上帝雇。UIView(當(dāng)然NSView也一樣)加入了一個(gè)新的實(shí)例方法: -(void)addConstraint:(NSLayoutConstraint )constraint; 用來(lái)將約束添加到view涮俄。在添加時(shí)唯一要注意的是添加的目標(biāo)view要遵循以下規(guī)則:對(duì)于兩個(gè)同層級(jí)view之間的約束關(guān)系,添加到他們的父view上

圖片加載中...
對(duì)于兩個(gè)不同層級(jí)view之間的約束關(guān)系尸闸,添加到他們最近的共同父view上
圖片加載中...
對(duì)于有層次關(guān)系的兩個(gè)view之間的約束關(guān)系彻亲,添加到層次較高的父view上
圖片加載中...
刷新
可以通過(guò)-setNeedsUpdateConstraints和-layoutIfNeeded兩個(gè)方法來(lái)刷新約束的改變孕锄,使UIView重新布局。這和CoreGraphic的-setNeedsDisplay一套東西是一樣的~Visual Format Language 可視格式語(yǔ)言
UIKit團(tuán)隊(duì)這次相當(dāng)有愛苞尝,估計(jì)他們自己也覺(jué)得新加約束的API名字太長(zhǎng)了畸肆,因此他們發(fā)明了一種新的方式來(lái)描述約束條件,十分有趣宙址。這種語(yǔ)言是對(duì)視覺(jué)描述的一種抽象轴脐,大概過(guò)程看起來(lái)是這樣的:accept按鈕在cancel按鈕右側(cè)默認(rèn)間距處
圖片加載中...
圖片加載中...
圖片加載中...
最后使用VFL(Visual Format Language)描述變成這樣:
[csharp]*view plaincopy 1[NSLayoutConstraintconstraintsWithVisualFormat:@\"[cancelButton]-[acceptButton]\"
2options:0
3metrics:nil
4views:viewsDictionary];

其中viewsDictionary是綁定了view的名字和對(duì)象的字典,對(duì)于這個(gè)例子可以用以下方法得到對(duì)應(yīng)的字典:[csharp]view plaincopy 1UIButtoncancelButton=...
2UIButton
acceptButton=...
3viewsDictionary=NSDictionaryOfVariableBindings(cancelButton,acceptButton);

生成的字典為當(dāng)然抡砂,不嫌累的話自己手寫也未嘗不可〈笤郏現(xiàn)在字典啊數(shù)組啊寫法相對(duì)簡(jiǎn)化了很多了,因此也不復(fù)雜注益。關(guān)于Objective-C的新語(yǔ)法碴巾,可以參考我之前的一篇WWDC 2012筆記:WWDC 2012 Session筆記——405 Modern Objective-C。在view名字后面添加括號(hào)以及連接處的數(shù)字可以賦予表達(dá)式更多意義丑搔,以下進(jìn)行一些舉例: [cancelButton(72)]-12-[acceptButton(50)] 取消按鈕寬72point厦瓢,accept按鈕寬50point,它們之間間距12point [wideView(>=60@700)] wideView寬度大于等于60point啤月,該約束條件優(yōu)先級(jí)為700(優(yōu)先級(jí)最大值為1000煮仇,優(yōu)先級(jí)越高的約束越先被滿足) V:[redBox][yellowBox(==redBox)] 豎直布局,先是一個(gè)redBox谎仲,其下方緊接一個(gè)寬度等于redBox寬度的yellowBox H:|-[Find]-[FindNext]-[FindField(>=20)]-| 水平布局浙垫,F(xiàn)ind距離父view左邊緣默認(rèn)間隔寬度,之后是FindNext距離Find間隔默認(rèn)寬度强重;再之后是寬度不小于20的FindField绞呈,它和FindNext以及父view右邊緣的間距都是默認(rèn)寬度。(豎線'|‘ 表示superview的邊緣)容易出現(xiàn)的錯(cuò)誤
因?yàn)樯婕凹s束問(wèn)題间景,因此約束模型下的所有可能出現(xiàn)的問(wèn)題這里都會(huì)出現(xiàn),具體來(lái)說(shuō)包括兩種:Ambiguous Layout 布局不能確定Unsatisfiable Constraints 無(wú)法滿足約束 布局不能確定指的是給出的約束條件無(wú)法唯一確定一種布局艺智,也即約束條件不足倘要,無(wú)法得到唯一的布局結(jié)果。這種情況一般添加一些必要的約束或者調(diào)整優(yōu)先級(jí)可以解決十拣。無(wú)法滿足約束的問(wèn)題來(lái)源是有約束條件互相沖突封拧,因此無(wú)法同時(shí)滿足,需要?jiǎng)h掉一些約束夭问。兩種錯(cuò)誤在出現(xiàn)時(shí)均會(huì)導(dǎo)致布局的不穩(wěn)定和錯(cuò)誤泽西,Ambiguous可以被容忍并且選擇一種可行布局呈現(xiàn)在UI上,Unsatisfiable的話會(huì)無(wú)法得到UI布局并報(bào)錯(cuò)缰趋。對(duì)于不能確定的布局捧杉,可以通過(guò)調(diào)試時(shí)暫停程序陕见,在debugger中輸入

po [[UIWindow keyWindow] _autolayoutTrace] 來(lái)檢查是否存在Ambiguous Layout以及存在的位置,來(lái)幫助添加條件味抖。另外還有一些檢查方法评甜,來(lái)查看view的約束和約束狀態(tài):[view constraintsAffectingLayoutForOrientation/Axis: NSLayoutConstraintOrientationHorizontal/Vertical][view hasAmbiguousLayout] [view exerciseAmbiguityInLayout]布局動(dòng)畫
動(dòng)畫是UI體驗(yàn)的重要部分,更改布局以后的動(dòng)畫也非常關(guān)鍵仔涩。說(shuō)到動(dòng)畫忍坷,Core Animation又立功了..自從CA出現(xiàn)以后,所有的動(dòng)畫效果都非常cheap熔脂,在auto layout中情況也和collection view里一樣佩研,很簡(jiǎn)單(可以參考 WWDC 2012 Session筆記——219 Advanced Collection Views and Building Custom Layouts),只需要把layoutIfNeeded放到animation block中即可~[csharp]view plaincopy 1[UIViewanimateWithDuration:0.5animations:^{
2[viewlayoutIfNeeded];
3}];

?SizeClass
http://joywii.github.io/blog/2014/09/24/ios8-size-classesde-li-jie-yu-shi-yong/
Size Classes是什么
iOS 8在應(yīng)用界面的可視化設(shè)計(jì)上添加了一個(gè)新的特性-Size Classes霞揉,對(duì)于任何設(shè)備來(lái)說(shuō)韧骗,界面的寬度和高度都只分為兩種描述:正常
和緊湊
。這樣開發(fā)者便可以無(wú)視設(shè)備具體的尺寸零聚,而是對(duì)這兩類和它們的組合進(jìn)行適配袍暴。這樣不論在設(shè)計(jì)時(shí)還是代碼上,我們都可以不再受限于具體的尺寸隶症,而是變成遵循尺寸的視覺(jué)感官來(lái)進(jìn)行適配政模。在Xcode中的具體體現(xiàn)如下圖:

Alt text

但是我們看到圖中的寬度和高度都是Any
,Any是什么意思呢?如果weight
設(shè)為Any
蚂会,height
設(shè)置為Regular
淋样,那么在該狀態(tài)下的界面元素在只要height
為Regular
,無(wú)論weight
是Regular
還是Compact
的狀態(tài)中都會(huì)存在胁住。這種關(guān)系應(yīng)該叫做繼承關(guān)系趁猴,具體的四種界面描述與可繼承的界面描述如下:
w:Compact h:Compact 繼承 (w:Any h:Compact,w:Compact h:Any,w:Any h:Any)
w:Regular h:Compact 繼承 (w:Any h:Compact,w:Regular h:Any,w:Any h:Any)
w:Compact h:Regular 繼承 (w:Any h:Regular,w:Compact h:Any,w:Any h:Any)
w:Regular h:Regular 繼承 (w:Any h:Regular,w:Regular h:Any,w:Any h:Any)我們知道了iOS 8下面設(shè)備界面可以描述為4種,但是這么多設(shè)備(iPhone4S,iPhone5/5s,iPhone6,iPhone6 Plus,iPad,Apple Watch)具體對(duì)應(yīng)什么描述呢彪见?經(jīng)過(guò)查看官方文檔和具體實(shí)踐得知具體對(duì)應(yīng)關(guān)系如下:
iPhone4S,iPhone5/5s,iPhone6豎屏:(w:Compact h:Regular)
橫屏:(w:Compact h:Compact)
iPhone6 Plus豎屏:(w:Compact h:Regular)
橫屏:(w:Regular h:Compact)
iPad豎屏:(w:Regular h:Regular)
橫屏:(w:Regular h:Regular)
Apple Watch(猜測(cè))豎屏:(w:Compact h:Compact)
橫屏:(w:Compact h:Compact)Size Classes手寫代碼
為了表征Size Classes
儡司,Apple在iOS8中引入了一個(gè)新的類,UITraitCollection
余指。這個(gè)類封裝了像水平和豎直方向的Size Class等信息捕犬。iOS8的UIKit中大多數(shù)UI的基礎(chǔ)類(包括UIScreen,UIWindow,UIViewController和UIView)都實(shí)現(xiàn)了UITraitEnvironment
這個(gè)接口,通過(guò)其中的traitCollection
這個(gè)屬性酵镜,我們可以拿到對(duì)應(yīng)的UITraitCollection
對(duì)象碉碉,從而得知當(dāng)前的Size Class,并進(jìn)一步確定界面的布局淮韭。和UIKit中的響應(yīng)者鏈正好相反垢粮,traitCollection
將會(huì)在view hierarchy
中自上而下地進(jìn)行傳遞。對(duì)于沒(méi)有指定traitCollection
的UI部件靠粪,將使用其父節(jié)點(diǎn)的traitCollection
蜡吧。這在布局包含childViewController
的界面的時(shí)候會(huì)相當(dāng)有用毫蚓。在UITraitEnvironment
這個(gè)接口中另一個(gè)非常有用的是-traitCollectionDidChange:
。在traitCollection
發(fā)生變化時(shí)斩跌,這個(gè)方法將被調(diào)用绍些。在實(shí)際操作時(shí),我們往往會(huì)在ViewController
中重寫-traitCollectionDidChange:
或者-willTransitionToTraitCollection:withTransitionCoordinator:
方法(對(duì)于ViewController
來(lái)說(shuō)的話耀鸦,后者也許是更好的選擇柬批,因?yàn)樘峁┝宿D(zhuǎn)場(chǎng)上下文方便進(jìn)行動(dòng)畫;但是對(duì)于普通的View來(lái)說(shuō)就只有前面一個(gè)方法了)袖订,然后在其中對(duì)當(dāng)前的traitCollection
進(jìn)行判斷氮帐,并進(jìn)行重新布局以及動(dòng)畫。代碼看起來(lái)大概會(huì)是這個(gè)樣子:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<code>- (
void
)willTransitionToTraitCollection:(UITraitCollection *)newCollection

withTransitionCoordinator:(id <uiviewcontrollertransitioncoordinator>)coordinator

{

[
super
willTransitionToTraitCollection:newCollection

withTransitionCoordinator:coordinator];

[coordinator animateAlongsideTransition:^(id <uiviewcontrollertransitioncoordinatorcontext> context)

{

if
(newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {

//To Do: modify something for compact vertical size

}
else
{

//To Do: modify something for other vertical size

}

[self.view setNeedsLayout];

} completion:nil];

}</uiviewcontrollertransitioncoordinatorcontext></uiviewcontrollertransitioncoordinator></code>

在兩個(gè)To Do處洛姑,我們要手寫代碼針對(duì)不同的狀態(tài)做調(diào)整上沐。
Size Classes與Interface Builder
Xcode6中Interface Builder
對(duì)Size Class
有了很強(qiáng)大的支持,xib中可以開啟Size Classes如下圖:


Alt text

在不同的Size Classes
描述下楞艾,界面元素可以選擇安裝還是不安裝参咙,具體操作如圖:


Alt text

Size Classes與Image Asset
Xcode6中Image Asset
也支持了Size Class
,也就是說(shuō),我們可以對(duì)不同的Size Class
指定不同的圖片了。在Image Asset
的編輯面板中選擇某張圖片硫眯,Inspector里現(xiàn)在多了一個(gè)Width

和Height
的組合蕴侧,添加我們需要對(duì)應(yīng)的Size Class
,然后把合適的圖拖上去两入,這樣在運(yùn)行時(shí)SDK
就將從中挑選對(duì)應(yīng)的Size
的圖進(jìn)行替換了净宵。支持Size Class
的Image Asset
編輯效果如下:


Alt text
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裹纳,隨后出現(xiàn)的幾起案子择葡,更是在濱河造成了極大的恐慌,老刑警劉巖剃氧,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敏储,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡她我,警方通過(guò)查閱死者的電腦和手機(jī)虹曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)番舆,“玉大人,你說(shuō)我怎么就攤上這事矾踱『薇罚” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵呛讲,是天一觀的道長(zhǎng)禾怠。 經(jīng)常有香客問(wèn)我返奉,道長(zhǎng),這世上最難降的妖魔是什么吗氏? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任芽偏,我火速辦了婚禮,結(jié)果婚禮上弦讽,老公的妹妹穿的比我還像新娘污尉。我一直安慰自己,他們只是感情好往产,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布被碗。 她就那樣靜靜地躺著,像睡著了一般仿村。 火紅的嫁衣襯著肌膚如雪锐朴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天蔼囊,我揣著相機(jī)與錄音焚志,去河邊找鬼。 笑死畏鼓,一個(gè)胖子當(dāng)著我的面吹牛酱酬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滴肿,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼岳悟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泼差?” 一聲冷哼從身側(cè)響起贵少,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堆缘,沒(méi)想到半個(gè)月后滔灶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吼肥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年录平,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀皱。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斗这,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啤斗,到底是詐尸還是另有隱情表箭,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布钮莲,位于F島的核電站免钻,受9級(jí)特大地震影響彼水,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜极舔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一凤覆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拆魏,春花似錦盯桦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至溪掀,卻和暖如春事镣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揪胃。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工璃哟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捻勉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铐伴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容