iPhone多尺寸螢幕適配--等比例數值計算,iphone適配
作為一個iOS開放者,在iPhone6和iPhone6 plus發布之後,慢慢的都會遇到螢幕適配的問題。
在討論適配之前,我們先來看看系統提供的放大模式。
放大模式下:螢幕尺寸仍然為320寬度,會根據裝置,介面等比放大至其他螢幕寬度的尺寸,由於是放大,會導致介面有輕微的模糊,並且狀態列也會和平時不一樣(明顯變大了)。
那麼適配模式下呢?不同尺寸裝置的螢幕點像素是不一樣的,如果要處理一個介面,並且要求iPhone6plus和iPhone5S是同一套設計稿,看起來一樣比例。那麼怎麼破?
無論是使用傳統布局,還是使用AutoLayout,都避不開的是介面的數值計算,比如同一個左邊距,在iPhone5下是10px,但是等比換算到iPhone6plus的時候差不多就是13px了,莫非為了不同螢幕看起來比例一樣,我們還要分開處理,用條件來判斷並分別布局嗎?
當我開始這麼想的時候,我是拒絕的,因為我們是愛加特效的開發人員,怎麼能連等比例計算都不會玩呢?
好了拿到iPhone5s螢幕尺寸640*1136的設計稿,什嗎?左邊距是20px?
CGFloat leftPadding = 10*SCREEN_WIDTH/320.0;
LOOK! 我們已經有了一個可以在各個尺寸螢幕下按同一個設計稿等比例適應的左邊距了! 恩恩,還有很多值,一個個來…
CGFloat rightPadding = 15*SCREEN_WIDTH/320.0;CGFloat topPadding = 20*SCREEN_WIDTH/320.0;.....
等等,這麼算,貌似有很多重複的東西出現了:SCREEN_WIDTH/320.0,作為一個有追求的開發人員,怎麼能忍受那麼多重複的計算。必須加特效!
這裡我為了便捷,使用類似CGRect之類C函數實現,考慮效能沒有使用inline。建立一個空的UIView的category
.h標頭檔中:
extern CGFloat CGFloatIn320(CGFloat value);
.m實現檔案中:
static CGFloat ratio = 0;//這是為了只算一次不要浪費太多計算比例的效能CGFloat CGFloatIn320(CGFloat value){ if (ratio==0) { ratio = ([UIScreen mainScreen].bounds.size.width >[UIScreen mainScreen].bounds.size.height ?[UIScreen mainScreen].bounds.size.height :[UIScreen mainScreen].bounds.size.width)/320.0; } return value*ratio;}
好了,現在再來計算我們的邊距:
CGFloat leftPadding = CGFloatIn320(10);CGFloat rightPadding = CGFloatIn320(15);CGFloat topPadding = CGFloatIn320(20);.....
這樣看起來真的是蠻不錯啊,相信許多開發小夥伴也在用類似這樣的方式做布局,總體上來說,這是要求不同尺寸相同比例布局的一個可行的方案,但是還是要多說兩句:這種方式下的計算有時候會存在很小很小的偏差,雖然不多,但是有時候也會影響效果,所以,必要時的等分計算、自動布局的使用都是提高介面精確程度的方式。
當然,這麼簡單的文章相信大家都能看得懂。最後貼上一篇別人家的文章,希望大家都能做好適配處理:
iPhone 6出現後,如何將一份設計稿支援多個尺寸?