華山論劍之淺談iOS的屏幕適配(AutoLayout與Masonry)

在iPhone之初,4s的屏幕邏輯分辨率只有320*480,我們是不需要做屏幕適配的,但是到了如今,iPhone5,iPhone6s,iPhone 6s plus ,屏幕的邏輯分辨率已經(jīng)大大的有所改變了.所以,作為程序猿的我們做的就是屏幕的適配工作.今天,我就重可視化和純代碼來說一下屏幕適配的問題.

iPhone機(jī)型 屏幕分辨率
iPhone4(s) 320x480
iPhone5c 320x568
iPhone5(s) 320x568
iPhone6 375x667
iPhone6s(plus) 375x667


可視化編程


可視化編程是適合獨(dú)立開發(fā),快速開發(fā)的一種形式,但是不利于后期的維護(hù),可視化編程的屏幕適配主要是用到了AutoLayout的,當(dāng)然了還有SizeClasses,今天我只談一下我對(duì)AutoLayout的理解和認(rèn)識(shí).AutoLayout加起來比較簡單,但是對(duì)于初學(xué)者而言,可能加約束加著加著就加錯(cuò)了,那么我們?cè)诩蛹s束的期間要遵循什么的原則呢? 其實(shí)很簡單,就是大小和位置,大小就是寬和高,位置就是x和y.下面我們看一個(gè)范例,看AutoLayout是如何實(shí)現(xiàn)屏幕適配的.

首先我們現(xiàn)在創(chuàng)建一個(gè)新的工程,然后在main.storyboard里面ViewController上面添加一View,并給它添加顏色

然后我們就選中這個(gè)View,我們用右下角的倒數(shù)第三個(gè)圖標(biāo)按鈕給他添加約束.添加約束的工具欄如下.

添加約束的原則就是如何固定一個(gè)對(duì)象!(從位置和大小入手)

當(dāng)我們添加完成約束之后,我們就要調(diào)整約束對(duì)象的位置.如下圖使用右下角第四個(gè)圖標(biāo)把我們的約束添加到對(duì)象身上去.

那么當(dāng)我們不需要某個(gè)約束,或者想修改某個(gè)約束的時(shí)候,我們應(yīng)該從哪里找到我們的約束條件呢?這里,我們要先選中要修改的對(duì)象.然后點(diǎn)擊右邊的菜單欄中的第五個(gè)圖標(biāo)按鈕.


純代碼屏幕適配


對(duì)于純代碼的屏幕適配,一種方法就是計(jì)算相對(duì)距離.一種是AutoLayer + UIView ,還有一種是重量級(jí)的Masonry.

在一開始的時(shí)候,程序員做屏幕適配的時(shí)候,就是純粹的和屏幕的大小做相對(duì)距離的計(jì)算.直到iOS6的時(shí)候出現(xiàn)了AutoLayer +UIView.再到后來的Masonry.

對(duì)呀我來說,可視化的時(shí)候我喜歡使用AutoLayer ,但是純代碼我更傾向于Masonry自動(dòng)布局.我們先看一下使用AutoLayer +UIView是如何定義兩個(gè)視圖的.


- (void)viewDidLoad {
    [super viewDidLoad];

    
    UIView *myview = [[UIView alloc] init];
   
    myview.backgroundColor = [UIColor greenColor];
    
    UIView *redView = [[UIView alloc] init];
   
    redView.backgroundColor = [UIColor redColor];
    
    UIView *blueView = [[UIView alloc] init];
    
    blueView.backgroundColor = [UIColor blueColor];
   
    [myview addSubview:redView];
    
    [myview addSubview:blueView];
   
    [myview setTranslatesAutoresizingMaskIntoConstraints:NO];
    
    [redView setTranslatesAutoresizingMaskIntoConstraints:NO];
    
    [blueView setTranslatesAutoresizingMaskIntoConstraints:NO];
   
    NSMutableArray *tmpConstraints = [NSMutableArray array];
   
    //約束條件
    [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-50-[redView(==100)]-30-[blueView(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView,blueView)]];
    
    [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[redView(==30)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView)]];
    
    [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[blueView(==redView)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView,redView)]];
    
    [myview addConstraints:tmpConstraints];
    
    self.view = myview;
}


Masonry


看到AutoLayer +UIView這么麻煩,那么對(duì)比Masonry就簡單了許多.Masonry其實(shí)就是對(duì)AutoLayer +UIView的封裝.

首先我們先導(dǎo)入我們的Masonry的庫.

#import <Masonry/Masonry.h>

然后,我們分情況寫一下,當(dāng)是一個(gè)視圖扥時(shí)候,并且我們的視圖要求是居中,并且視圖大小是200 * 200,
MASConstraintMaker 就是我們的假約束的對(duì)象,是有如下屬性的,我們可以根據(jù)這些屬性給我們的目對(duì)象添加對(duì)應(yīng)的約束.

@property (nonatomic, strong, readonly) MASConstraint *left;//左側(cè)
@property (nonatomic, strong, readonly) MASConstraint *top;//上側(cè)
@property (nonatomic, strong, readonly) MASConstraint *right;//右側(cè)
@property (nonatomic, strong, readonly) MASConstraint *bottom;//下側(cè)
@property (nonatomic, strong, readonly) MASConstraint *leading;//首部
@property (nonatomic, strong, readonly) MASConstraint *trailing;//尾部
@property (nonatomic, strong, readonly) MASConstraint *width;//寬
@property (nonatomic, strong, readonly) MASConstraint *height;//高
@property (nonatomic, strong, readonly) MASConstraint *centerX;//橫向居中
@property (nonatomic, strong, readonly) MASConstraint *centerY;//縱向居中
@property (nonatomic, strong, readonly) MASConstraint *baseline;//文本基線

那么具體代碼設(shè)置如下.

// 防止block中的循環(huán)引用
    __weak typeof (self) weakSelf = self;
    // 初始化一個(gè)View
    UIView *bgView = [[UIView alloc]init];
    bgView.backgroundColor = [UIColor redColor];
    [self.view addSubview:bgView];
    // 使用mas_makeConstraints添加約束
    [bgView mas_makeConstraints:^(MASConstraintMaker *make) {
        //設(shè)置視圖中心在父視圖的中心上
        make.center.equalTo(weakSelf.view);
        //設(shè)置視圖的大小
        make.size.mas_equalTo(CGSizeMake(200, 200));
    }];
    

當(dāng)是兩個(gè)視圖,我們需要做的是 2個(gè)view橫向居中掸宛,第二個(gè)view距離第一個(gè)view間距為10

 UIView *view1 = [[UIButton alloc]init];
    view1.backgroundColor = [UIColor redColor];
    [self.view addSubview:view1];
    [view1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(90, 90));
        make.centerX.equalTo(weakSelf.view);
        make.top.width.offset(90);
    }];
    UIView *view2 = [[UILabel alloc]init];
    view2.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:view2];
    [view2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(100, 100));
        make.centerX.equalTo(view1);
        make.top.equalTo(view1.mas_bottom).with.offset(20);
    }];
注意: 添加約束之前必須把約束對(duì)象添加到父視圖上!!!
整體上來說,為什么選擇Masonry,因?yàn)镸asonry便于后期的維護(hù).而且相比與AutoLayer +UIView 的方法更加的簡便.希望通過這篇文章對(duì)大家的屏幕適配有所幫助

--->Masonry參考博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耳幢,一起剝皮案震驚了整個(gè)濱河市奔穿,隨后出現(xiàn)的幾起案子塞椎,更是在濱河造成了極大的恐慌悦陋,老刑警劉巖巫俺,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剖淀,居然都是意外死亡纯蛾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門纵隔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翻诉,“玉大人,你說我怎么就攤上這事捌刮∨龌停” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵绅作,是天一觀的道長芦圾。 經(jīng)常有香客問我,道長俄认,這世上最難降的妖魔是什么个少? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮眯杏,結(jié)果婚禮上稍算,老公的妹妹穿的比我還像新娘。我一直安慰自己役拴,他們只是感情好糊探,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著河闰,像睡著了一般科平。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姜性,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天瞪慧,我揣著相機(jī)與錄音,去河邊找鬼部念。 笑死弃酌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儡炼。 我是一名探鬼主播妓湘,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乌询!你這毒婦竟也來了榜贴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤妹田,失蹤者是張志新(化名)和其女友劉穎唬党,沒想到半個(gè)月后鹃共,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驶拱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年霜浴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝纲。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坷随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驻龟,到底是詐尸還是另有隱情温眉,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布翁狐,位于F島的核電站类溢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏露懒。R本人自食惡果不足惜闯冷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望懈词。 院中可真熱鬧蛇耀,春花似錦、人聲如沸坎弯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抠忘。三九已至撩炊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崎脉,已是汗流浹背拧咳。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囚灼,地道東北人骆膝。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像灶体,于是被迫代替她去往敵國和親阅签。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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