快速自動化適配iPhone X

原文地址:快速自動化適配iPhone X

關(guān)于iPhone X的適配擦剑,主要需要做的工作點就是針對上下非安全區(qū)域的適配控妻。

在iOS開發(fā)中,針對于布局存在 xib 與 代碼編輯 兩種方式妄呕。而這兩種方式又都支持 絕對布局 與 AutoLayout 兩種。

接下來本文將從xib捡多、代碼編輯蓖康、絕對布局铐炫、Autolayout幾個布局方式來講解如何針對iPhone X做自動化適配

Xib布局

Xib的絕對布局并不靈活,如果想要通過特有因素更改View的Frame則需要通過屬性索引來實現(xiàn)蒜焊。所以這里只針對Xib的AutoLayout來做講解

首先XCode9的Xib為我們提供了SafeAreaLayout選項倒信,而這個選項并不支持iOS9以前的版本。

SafeAreaLayout

那么我們需要針對靠近底部或者頂部非安全區(qū)域的View做約束就可以達到理想效果泳梆,然而約束的值卻不能固定鳖悠,你還需要兼顧非iPhone X的機型。

那么你可以從以下幾點中找到解決方法:

首先我們的布局文件如下:

三個相同的Label位于控制器根View的底部

約束文件

首先优妙,如果你是做一個新的頁面乘综,那么在設置約束時,添加Constrain to margins屬性會幫你大忙套硼,布局文件中的第二個Label就是使用Margin屬性進行布局卡辰。

Constrain to margins

首先,如果你有一個已經(jīng)存在的頁面邪意,而且已經(jīng)設置好了約束的布局九妈,那么你可以找到對應的約束屬性,勾選它的Relative to margin選項雾鬼,將此約束屬性以指向相對于marigin萌朱。

雙擊它 (╯>д<)╯?˙3˙?

約束屬性 Relative to margin入口

勾選它 (╯>д<)╯?˙3˙?

Relative to margin

接下來我們可以看到這三種布局產(chǎn)生的效果

你可以通過布局視圖左下角的View as: (某某機型) ,選擇iPhone X機型來快速查看布局應用結(jié)果策菜。

布局效果

以及運行的效果

運行效果

可以看到晶疼,基礎約束并不會對iPhone X底部的非安全區(qū)域進行適配酒贬,而Constrain to margins 與Relative to margin作用下的約束,則可以完美的適應iPhone X翠霍。

使用代碼布局

代碼布局依然可以通AutoLayout進行布局同衣,同時也可以通過分支判斷來進行絕對布局。

AutoLayout

1.如果你需要使用原生的API來進行AutoLayout布局壶运,那么你可以使用NSLayoutAttributeBottomMargin作為Bottom的約束枚舉值

NSLayoutConstraint?*constraint?=?[NSLayoutConstraint?constraintWithItem:self.leftLabel?>attribute:NSLayoutAttributeBottomMargin?relatedBy:NSLayoutRelationEqual?toItem:self.rightLabel?>attribute:NSLayoutAttributeBottom?multiplier:1constant:0];

[self.view?addConstraint:constraint];

2.如果你的Autolayout是通過Masonry進行編輯的耐齐,那么你只需要更改底部約束

在更早的Masonry版本中

由:

make.bottom.equalTo(self.view.mas_bottom);

改為:

make.bottom.equalTo(self.view.mas_bottomMargin);

[self.rightLabel?mas_makeConstraints:^(MASConstraintMaker?*make)?{

make.height.mas_equalTo(100);

make.left.equalTo(self.leftLabel.mas_right);

make.right.equalTo(self.view);

make.bottom.equalTo(self.view.mas_bottomMargin);

}];

在新的Masonry版本中,當編譯器提醒你找不到mas_bottomMargin時蒋情,通過:

由:

1make.bottom.equalTo(self.view.mas_bottom);

改為:

make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);

[self.rightLabel?mas_makeConstraints:^(MASConstraintMaker?*make)?{

make.height.mas_equalTo(100);

make.left.equalTo(self.leftLabel.mas_right);

make.right.equalTo(self.view);

if(@available(iOS11.0,?*))?{

make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);

}else{

make.bottom.equalTo(self.view.mas_bottom);

}

}];

完整代碼如下

-?(void)viewDidLoad?{

[superviewDidLoad];

self.title?=?@"代碼布局";

[self?initSubViews];

[self?initLayout];

}

-?(void)initSubViews{

UILabel?*leftLabel?=?[[UILabel?alloc]?init];

leftLabel.text?=?@"基礎約束";

leftLabel.numberOfLines?=0;

leftLabel.textAlignment?=?NSTextAlignmentCenter;

leftLabel.backgroundColor?=?[UIColor?orangeColor];

UILabel?*rightLabel?=?[[UILabel?alloc]?init];

rightLabel.text?=?@"Constrain?to?margins";

rightLabel.numberOfLines?=0;

rightLabel.textAlignment?=?NSTextAlignmentCenter;

rightLabel.backgroundColor?=?[UIColor?blueColor];

[self.view?addSubview:leftLabel];

[self.view?addSubview:rightLabel];

self.leftLabel?=?leftLabel;

self.rightLabel?=?rightLabel;

}

-?(void)initLayout{

[self.leftLabel?mas_makeConstraints:^(MASConstraintMaker?*make)?{

make.height.mas_equalTo(100);

make.width.equalTo(self.view).multipliedBy(0.5);

make.left.equalTo(self.view);

make.bottom.equalTo(self.view.mas_bottom);

}];

[self.rightLabel?mas_makeConstraints:^(MASConstraintMaker?*make)?{

make.height.mas_equalTo(100);

make.left.equalTo(self.leftLabel.mas_right);

make.right.equalTo(self.view);

if(@available(iOS11.0,?*))?{

make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);

}else{

make.bottom.equalTo(self.view.mas_bottom);

}

}];

}

以及運行的效果

代碼布局

使用代碼布局

絕對布局

如果你需要使用代碼進行絕對布局埠况,那么iOS11中View的safeAreaInsets屬性可以幫到你。因為safeAreaInsets最低支持iOS11的緣故棵癣,所以你需要加入版本判斷來使用辕翰。safeAreaInsets會給出你上下左右各個方位的非安全區(qū)域的大小,你可以通過這些值來設置自己的View的位置狈谊。

1@property?(nonatomic,readonly)?UIEdgeInsets?safeAreaInsets?API_AVAILABLE(ios(11.0),tvos(11.0));

在這里我準備了幾個宏供大家使用

#define?IOS11_OR_LATER_SPACE(par)

({

float?space?=0.0;

if(@available(iOS11.0,?*))

space?=?par;

(space);

})

#define?JF_KEY_WINDOW?[UIApplication?sharedApplication].keyWindow

#define?JF_TOP_SPACE?IOS11_OR_LATER_SPACE(JF_KEY_WINDOW.safeAreaInsets.top)

#define?JF_TOP_ACTIVE_SPACE?IOS11_OR_LATER_SPACE(MAX(0,?JF_KEY_WINDOW.safeAreaInsets.top-20))

#define?JF_BOTTOM_SPACE?IOS11_OR_LATER_SPACE(JF_KEY_WINDOW.safeAreaInsets.bottom)

宏里已經(jīng)進行了版本判斷喜命,如果你需要設置一個View置于控制器根View的底部,那么只需要通過

-?(void)createView{

UIView?*view?=?[[UIView?alloc]?initWithFrame:CGRectMake(0,0,100,100)];

view.backgroundColor?=?[UIColor?redColor];

[self.view?addSubview:view];

self.bottomView?=?view;

}

-?(void)viewDidLayoutSubviews{

[superviewDidLayoutSubviews];

CGRect?frame?=?self.bottomView.frame;

frame.origin.y?=?self.view.bounds.size.height?-?frame.size.height?-?JF_BOTTOM_SPACE;

self.bottomView.frame?=?frame;

}

以上代碼河劝,來減去非安全區(qū)的位置即可

PS:safeAreaInsets還可以用來進行設置連接于View邊緣的ScrollView的Insets額外滑動區(qū)域

Demo下載:https://github.com/Jiang-Fallen/LayoutiPhoneX

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壁榕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赎瞎,更是在濱河造成了極大的恐慌牌里,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件务甥,死亡現(xiàn)場離奇詭異牡辽,居然都是意外死亡,警方通過查閱死者的電腦和手機敞临,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門态辛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挺尿,你說我怎么就攤上這事奏黑。” “怎么了票髓?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵攀涵,是天一觀的道長。 經(jīng)常有香客問我洽沟,道長以故,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任裆操,我火速辦了婚禮怒详,結(jié)果婚禮上炉媒,老公的妹妹穿的比我還像新娘。我一直安慰自己昆烁,他們只是感情好吊骤,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著静尼,像睡著了一般白粉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鼠渺,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天鸭巴,我揣著相機與錄音,去河邊找鬼拦盹。 笑死鹃祖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的普舆。 我是一名探鬼主播恬口,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沼侣!你這毒婦竟也來了祖能?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤华临,失蹤者是張志新(化名)和其女友劉穎芯杀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雅潭,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年却特,在試婚紗的時候發(fā)現(xiàn)自己被綠了扶供。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡裂明,死狀恐怖椿浓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闽晦,我是刑警寧澤扳碍,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站仙蛉,受9級特大地震影響笋敞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荠瘪,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一夯巷、第九天 我趴在偏房一處隱蔽的房頂上張望赛惩。 院中可真熱鬧,春花似錦趁餐、人聲如沸喷兼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季惯。三九已至,卻和暖如春臀突,著一層夾襖步出監(jiān)牢的瞬間星瘾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工惧辈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琳状,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓盒齿,卻偏偏與公主長得像念逞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子边翁,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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