iOS 8中Size Classes的使用

整理轉(zhuǎn)載自:Tommy@迷糊小書童www.cnblogs.com


前言
iOS8和iPhone6發(fā)布已經(jīng)過去蠻久了,廣大的果粉終于迎來了大屏iPhone,再也不用糾結(jié)為大屏買三星舍蘋果了…但是對于iOS開發(fā)人員來說,迎來了和Android開發(fā)開發(fā)一樣的問題—>各種屏幕的適配(是不是可以要求加工資的節(jié)奏).對于適配,網(wǎng)傳各種有關(guān)Size Class的論點,前段時間太忙,一直沒去研究,套用+總的話,蘋果在適配方面提供的方法做的比安卓好太多了.自己實測之后,確實很方便0.0(不過,還是想說,適配的核心始終是AutoLayout)

1418795367881579.png

概念初探
iOS8之前,公司在開發(fā)項目時,先做的iPhone版,然后要求開發(fā)iPad版本,其實內(nèi)容是完全一樣的,只是UI變化了,但是我們就需要建立2個工程來分別對應(yīng)實現(xiàn).iOS8推出的Size Class,可以讓我們在一個工程的storyboard中進行所有尺寸屏幕的適配,不僅是iPhone 4s-5/5s-6-6 Plus,還包括iPad界面.它引入了一種新的概念,拋棄傳統(tǒng)意義上我們適配時所謂的具體寬高尺寸,把屏幕的寬和高分別分成兩種情況:Compact-緊湊, Regular-正常(Any-任意,其實就是這2種的組合,所以我沒分成3種情況).搭配起來是3*3,也就是無論如何變化,加起來也就9種,如上圖.

1.實際應(yīng)用中,這Compact,Any,Regular如何運用呢?**

w:Any h:Any 是我們剛建立工程時候默認選擇的,算是一切描述的父類.其他的種類描述都是在此基礎(chǔ)上變化的,比如:如果weight設(shè)為Any,height設(shè)置為Regular,那么在該狀態(tài)下的界面元素在只要height為Regular,無論weight是Regular還是Compact的狀態(tài)中都會存在.于是:
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)

2. 再來看一組數(shù)據(jù)和一張圖(國外一位博主給出的,很形象):

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)


1418795540826221.png
3.可以總結(jié)為:

如果項目不支持橫屏顯示,使用w:Compact h:Regular(或者直接取消使用Size Class)
如果項目支持橫屏顯示,使用w:Compact h:Regular+w:Any h:Compact
對于一些公有的約束(任意組合中都適用),一般放在w:Any h:Any中設(shè)置

iPad同理

所以,我覺得Size Classes最大的幫助是,解決橫屏適配和iPhone iPad共享一個設(shè)計板…(個人意見)
試驗反饋一

  • 1.首先,先建立一個工程,展開如下頁面


    1418795619564332.png

    PS:這是iOS8的新特性,真的用到項目里需要等放棄兼容iOS7 。。。顯然,目前還是不行的

  • 2.在Any Any情況下,放置一個Label,并設(shè)置約束上-左-下-右為0-0-20-0


    1418795649852495.png

    1418795676961340.png
  • 3.在Compact Any情況下,又放置一個Label,并設(shè)置約束上為20


    1418795705149952.png
  • 4.繼續(xù)在Compact Any情況下,來看看橫屏狀態(tài)下的變化


    1418795785522114.png
  • 5.最后切換到Regular Any下,完成6 Plus 的橫屏顯示


    1418795810496572.png

試驗反饋二
試驗一里面,驗證了一下概念中所列舉的各個屏幕適用的組合,接下來,算是Size Classes 解決橫屏的妙用


1418795836776193.png

1418796024741244.png

1418796024510371.png

1418796063111839.png

PS:運用于,橫屏適配,重新排版豎屏時候的UI布局
除了改動不同組合下約束,也能改動控件在不同組合下是否顯示

1418796117706089.png

1418796117427802.png

試驗反饋三
AutoLayout這里不給具體如何設(shè)置,因為不知道如何寫,感覺還是大家多動手去寫,去試,最有效了
下面給出AutoLayout設(shè)置的圖解


1418796203135811.png

1418796203676119.png

簡答測試Demo結(jié)果圖:


1418796267535492.png

如果不橫屏,也可以直接取消Size Classes(圖不一樣,不同時間寫的…囧)


1418796274163824.png
4.Size Classes手寫代碼

為了表征Size Classes
,Apple在iOS8中引入了一個新的類,UITraitCollection。這個類封裝了像水平和豎直方向的Size Class等信息。iOS8的UIKit中大多數(shù)UI的基礎(chǔ)類(包括UIScreen,UIWindow,UIViewController和UIView)都實現(xiàn)了UITraitEnvironment這個接口,通過其中的traitCollection這個屬性,我們可以拿到對應(yīng)的UITraitCollection
對象,從而得知當前的Size Class,并進一步確定界面的布局。和UIKit中的響應(yīng)者鏈正好相反,traitCollection
將會在view hierarchy中自上而下地進行傳遞。對于沒有指定traitCollection的UI部件,將使用其父節(jié)點的traitCollection。這在布局包含childViewController的界面的時候會相當有用。在UITraitEnvironment這個接口中另一個非常有用的是-traitCollectionDidChange:。在traitCollection發(fā)生變化時,這個方法將被調(diào)用。在實際操作時,我們往往會在ViewController中重寫-traitCollectionDidChange:或者-willTransitionToTraitCollection:withTransitionCoordinator:方法(對于ViewController來說的話,后者也許是更好的選擇,因為提供了轉(zhuǎn)場上下文方便進行動畫;但是對于普通的View來說就只有前面一個方法了),然后在其中對當前的traitCollection進行判斷,并進行重新布局以及動畫。代碼看起來大概會是這個樣子:

    - (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];
    }

在兩個To Do處,我們要手寫代碼針對不同的狀態(tài)做調(diào)整。


文章整理自網(wǎng)絡(luò),侵刪
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

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

  • 1.尺寸適配1.原因 iOS7中所有導(dǎo)航欄都為半透明,導(dǎo)航欄(height=44)和狀態(tài)欄(height=20)不...
    LZM輪回閱讀 6,135評論 1 4
  • 據(jù)說Size Classes這項技能是iOS 8在應(yīng)用界面的可視化設(shè)計上添加的一個新的特性。個人認為此項特性主要是...
    GShining閱讀 1,351評論 0 0
  • Size Classes 是 Apple 在 iOS 8 推出的一個新特性,用于適配不同的設(shè)備屏幕的UI界面。在 ...
    要上班的斌哥閱讀 4,668評論 1 12
  • 一直對iOS布局中的size classes很迷惑,整理了幾篇介紹size classes的文章,僅供學習參考。 ...
    米斯特盧閱讀 1,069評論 0 2
  • 本故事純屬虛構(gòu),如有雷同,純屬真事,更不排除部分苦逼真實事件改編,看過之后,請權(quán)當找樂,就著泡面或者其他快餐一起,...
    梁哲澤閱讀 587評論 0 1