1.為什么要進(jìn)行屏幕適配
我們都知道現(xiàn)在市場(chǎng)上蘋(píng)果手機(jī)已經(jīng)有了很多款式例如:iPhone4,iPhone4s描扯,iPhone5倡怎,iPhone5s,iPhone5c奸晴,iPhone6冤馏,iPhone6p,iPhone6s寄啼,iPhone6sp等逮光。他們的尺寸也各有不同這里就不一一細(xì)說(shuō)了,我們看下兩張圖就知道為什么要屏幕適配了墩划。
這兩張圖就可以看出同是一個(gè)開(kāi)始按鈕涕刚,左邊的(iPhone4s)按鈕在靠右下角,右邊的(iPhone6)按鈕卻在中間乙帮。
那么怎么才能讓它們都在中間而不出現(xiàn)上述情況呢副女?這就是我要說(shuō)的第二點(diǎn)怎么進(jìn)行屏幕適配。
2.怎樣進(jìn)行屏幕適配
1)直接用storyboard和xib進(jìn)行可視化開(kāi)發(fā)
這種方法的優(yōu)點(diǎn)是:所見(jiàn)即所得蚣旱。意思就是直接將需要的UI控件放進(jìn)自己的controller或者view中然后拖線(xiàn)建立約束碑幅。
我們還是以上圖的開(kāi)始按鈕為例來(lái)進(jìn)行適配,由于該是配方法屬于直接拖線(xiàn)所以不存在寫(xiě)代碼那么我就直接用圖說(shuō)明吧H獭9嫡恰!
1.將按鈕拖入controller:
2.建立約束:
這樣我們就將這個(gè)開(kāi)始按鈕放在了屏幕中央异吻,就不會(huì)存在上圖iPhone4s和iPhone6在不同的地方了裹赴。如圖:
左圖為iPhone4s,右圖為iPhone6诀浪。
有利必有弊棋返,這種方法的缺點(diǎn)就是:如果界面的東西一旦多了那么拖的約束條件也就越多了,看的讓人眼花繚亂雷猪,而且一旦多了過(guò)后代碼維護(hù)起來(lái)就相當(dāng)麻煩了睛竣。怎么解決這種情況?當(dāng)然還有別的方法求摇,下面我們來(lái)看第二種用代碼進(jìn)行屏幕適配射沟。
2)代碼進(jìn)行屏幕適配
代碼適配又幾種常用的方法:
1.是蘋(píng)果原生的Auto Layout(自動(dòng)布局)殊者。
2.還有就是Auto Layout問(wèn)世之前所有的iOS開(kāi)發(fā)所用的每個(gè)UI控件都有一個(gè)屬性- (instancetype)initWithFrame:(CGRect)frame 來(lái)約束控件的位置,這種方法的缺點(diǎn)是并不能實(shí)現(xiàn)自動(dòng)的布局验夯,意思是如上圖的開(kāi)始按鈕他的長(zhǎng)寬都是被固定死的猖吴,不能根據(jù)上面的字?jǐn)?shù),字體自動(dòng)適應(yīng)大小挥转。
3.masonry這是一些大神在有了Auto Layout后覺(jué)得代碼量過(guò)大海蔽,書(shū)寫(xiě)很不方便。因此對(duì)Auto Layout進(jìn)行了二次封裝绑谣,masonry的出現(xiàn)很大程度上簡(jiǎn)化了iOS開(kāi)發(fā)中的屏幕適配問(wèn)題党窜。
現(xiàn)在我就將masonry和Auto Layout進(jìn)行下對(duì)比吧!S虺稹刑然!
這里我們創(chuàng)建一個(gè)button然后給他進(jìn)行屏幕適配(也就是建立約束):
UIButton *button = [[UIButton alloc] init];
button.translatesAutoresizingMaskIntoConstraints = NO;
button.backgroundColor = [UIColor greenColor];
[self.view addSubview:button];
//這樣我們就創(chuàng)建了一個(gè)button但是他的位置和尺寸并沒(méi)有確定∷吕蓿現(xiàn)在用Auto Layout建立約束暇务。
[self.view addConstraints:@[[NSLayoutConstraint constraintWithItem:button
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:10],
//上面這段代碼大體意思是建立self.view和button之間的頂部約束,距離頂端為10怔软,放大倍數(shù)為1垦细。(沒(méi)搞懂放大倍數(shù)是什么意思)下面代碼依次是左邊,下邊挡逼,右邊的約束條件括改。
[NSLayoutConstraint constraintWithItem:button
attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeLeft
multiplier:1.0
constant:10],
[NSLayoutConstraint constraintWithItem:button
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:-10],
[NSLayoutConstraint constraintWithItem:button
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeRight
multiplier:1
constant:-10],
]];
看過(guò)Auto Layout建立的約束我們?cè)趤?lái)看下用masonry建立的約束:
與上述一樣我們先創(chuàng)建一個(gè)button
UIButton *button = [[UIButton alloc] init];
button.translatesAutoresizingMaskIntoConstraints = NO;
button.backgroundColor = [UIColor greenColor];
[self.view addSubview:button];
//然后建立約束:
[button mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view.mas_top).with.offset(10);
make.left.equalTo(self.view.mas_left).with.offset(10);
make.bottom.equalTo(self.view.mas_bottom).with.offset(-10);
make.right.equalTo(self.view.mas_right).with.offset(-10);
}];
以上兩段代碼都達(dá)到同樣的效果,然而我們不難看出下面這段用masonry簡(jiǎn)潔了很多家坎。
那么我們?cè)賮?lái)說(shuō)一下- (instancetype)initWithFrame:(CGRect)frame:
這里我們直接創(chuàng)建lable直接給出它的位置大小嘱能。
UILable *lable = [[UILable alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
[self.view addaddSubview:lable];
這樣一個(gè)控件lable就創(chuàng)建好了,位置也進(jìn)行了固定虱疏。小括號(hào)內(nèi)的數(shù)字前兩個(gè)是代表lable的左上角距離self.view左上角的寬和高,后面的兩個(gè)數(shù)是lable的長(zhǎng)和寬惹骂。這樣的缺點(diǎn)是每一個(gè)UI控件都需要計(jì)算出它距離self.view左上角的寬和高,太過(guò)麻煩做瞪。
這些都是適配中的一些簡(jiǎn)單的基礎(chǔ)的東西对粪。更多復(fù)雜的需要在深度研究了。
3)可視化開(kāi)發(fā)和代碼結(jié)合
其實(shí)現(xiàn)在最主流的屏幕適配就是可視化開(kāi)發(fā)和代碼結(jié)合了装蓬,這里說(shuō)下我在適配屏幕中是怎么做的吧著拭!
當(dāng)界面太過(guò)復(fù)雜時(shí)或者在controller里面的時(shí)候那么我們就可使用代碼適配,當(dāng)然如果controller中的東西可以分離出來(lái)例如:cell(單元格)那么cell就可以采用可視化適配牍帚。