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的適配
絕對(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
的特性和用法。
- 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)?100480/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
了咨演。
- 小結(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主視圖右下角的
創(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上
可以通過(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)間距處
2options:0
3metrics:nil
4views:viewsDictionary];
其中viewsDictionary是綁定了view的名字和對(duì)象的字典,對(duì)于這個(gè)例子可以用以下方法得到對(duì)應(yīng)的字典:[csharp]view plaincopy 1UIButtoncancelButton=...
2UIButtonacceptButton=...
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)如下圖:
但是我們看到圖中的寬度和高度都是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如下圖:
在不同的Size Classes
描述下楞艾,界面元素可以選擇安裝還是不安裝参咙,具體操作如圖:
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
編輯效果如下: