iOS橫屏和豎屏布局不同的實現(xiàn)方案淺析

橫屏和豎屏布局不同的實現(xiàn)方案淺析
最近在開發(fā)中碰到了需要兼容橫豎屏的布局需求,由于要兼容iOS7且要適配目前所有的iOS尺寸,剛開始思路也不怎么明朗栖茉。在嘗試了好幾種不同的實現(xiàn)方案后症汹,磕磕絆絆踢故,最后終于實現(xiàn)了業(yè)務需求塑崖。這里主要跟大家分享一下橫豎屏布局方案的幾種思路。

0x01 簡單的橫豎屏布局痛倚,約束搞定

這是一種比較簡單的情形规婆,雖然橫屏和豎屏看上去不太一樣,但界面中元素的相對布局沒有變化,比如橫屏中A元素和B元素是上下布局抒蚜,豎屏中A元素和B元素也是上下布局掘鄙。這種情形下,為了適配不同尺寸的iOS設備嗡髓,使用Autolayout來布局比較合適操漠。 如下圖1和圖2是個一個典型的業(yè)務場景;

圖1

圖2

不管是橫屏和豎屏狀態(tài)下饿这,中間的灰色按鈕居中浊伙,最下面的紅色文本靠底部是一個固定的距離,這兩個元素的約束非常容易添加长捧。稍麻煩的是上面的文藍色本元素嚣鄙,要去不管是橫屏還是豎屏狀態(tài)下,均位于按鈕頂部和Top Layout Guide中間串结。這里我們可以再添加一個View哑子,使其底部與按鈕頂部對齊,頂部與Top Layout Guide對齊肌割,然后藍色文本豎直方向上居于這個View的中間即可卧蜓。如圖3,相信大家都能很容易明白把敞。
圖3

這個例子很簡單弥奸,橫屏和豎屏下元素的相對布局在方向上并沒有改變,用簡單的約束就可以輕松實現(xiàn)先巴。接下來重點分享幾個橫屏和豎屏界面元素相對布局在方向上差別很大或完全不同的情形其爵。

0x02 橫屏和豎屏差別較大時的適配方案

0x02.0x01 使用xib,內(nèi)置兩個不同的View伸蚯,方向旋轉(zhuǎn)時切換

下面是一種業(yè)務場景摩渺,A,B,C,D四個View在橫屏和豎屏狀態(tài)下的布局分別如圖-4和圖-5所示。 該如何實現(xiàn)這種布局呢(要兼容iOS7剂邮,暫不考慮使用SizeClass)摇幻?


圖4

圖5

這種情形可以使用xib來布局,新建一個ViewController,添加兩個與根View平行的View挥萌,其中一個稱之為portraitView绰姻,負責豎屏布局;另一個稱之為landscapeView引瀑,負責橫屏布局狂芋,然后在ViewController的viewDidLayoutsubviews里根據(jù)屏幕方向來動態(tài)切換。廢話不多說了憨栽,直接show code吧帜矾。

@property (strong, nonatomic) IBOutlet UIView *landscapeView;
@property (strong, nonatomic) IBOutlet UIView *portraitView;

@property (strong, nonatomic) UIView *currentView;

......

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self setupViewForOrientation];
}

- (void)setupViewForOrientation
{
    UIInterfaceOrientation oritentation = [[UIApplication sharedApplication] statusBarOrientation];
    [_currentView removeFromSuperview];
    if (UIInterfaceOrientationIsPortrait(oritentation)) {
        [self.view addSubview:_portraitView];
        _currentView = _portraitView;
        [_currentView setFrame:self.view.bounds];
        
    } else if (UIInterfaceOrientationIsLandscape(oritentation)) {
        [self.view addSubview:_landscapeView];
        _currentView = _landscapeView;
        [_currentView setFrame:self.view.bounds];
        
    }
}

xib中view的結構如下圖:


圖6

另外:storyboard上還不太清楚怎么添加多個平行的根view,請大神指教翼虫。

0x02.0x02 使用帶有優(yōu)先級的多約束,方向旋轉(zhuǎn)時屡萤,動態(tài)更改約束的優(yōu)先級

再來看下面圖7和圖8這個業(yè)務場景:橫屏下A和B水平排列珍剑,豎屏下A和B垂直排列。同樣死陆,如果使用xib招拙,添加兩個不同的view,可以很快的完成需求措译。這里再提供一種思路别凤,使用帶有優(yōu)先級的多個約束條件來實現(xiàn),當屏幕方向旋轉(zhuǎn)時瞳遍,動態(tài)改變約束的優(yōu)先級來達到目的闻妓。

圖7

圖8

在Autolayout中,添加的每個約束都有一個priority(優(yōu)先級)的概念掠械,默認狀況下高優(yōu)先級的會覆蓋低優(yōu)先級的約束由缆,因此我們在布局時可以給元素添加多個約束條件(優(yōu)先級不同),然后在屏幕方向旋轉(zhuǎn)時猾蒂,動態(tài)改變約束的優(yōu)先級來實現(xiàn)橫豎屏不同的界面布局均唉。 show code time:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *colorViewHeightConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *colorViewBottomConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *colorViewWidthConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *colorViewTrailingConstraint;

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *grayViewTopToColorViewConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *grayViewTopToSuperViewConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *grayViewLeadingToSuperViewConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *grayViewLeadingToColorViewConstraint;

......

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [self setupViewForOrientation];
}

......

- (void)setupViewForOrientation
{
    UIInterfaceOrientation oritentation = [[UIApplication sharedApplication] statusBarOrientation];
 
    if (UIInterfaceOrientationIsPortrait(oritentation)) {
        
        _colorViewHeightConstraint.priority = UILayoutPriorityDefaultHigh;
        _colorViewBottomConstraint.priority = UILayoutPriorityDefaultLow;
        _colorViewTrailingConstraint.priority = UILayoutPriorityDefaultHigh;
        _colorViewWidthConstraint.priority = UILayoutPriorityDefaultLow;
        
        _grayViewTopToColorViewConstraint.priority = UILayoutPriorityDefaultHigh;
        _grayViewTopToSuperViewConstraint.priority = UILayoutPriorityDefaultLow;
        _grayViewLeadingToSuperViewConstraint.priority = UILayoutPriorityDefaultHigh;
        _grayViewLeadingToColorViewConstraint.priority = UILayoutPriorityDefaultLow;
        
    } else if (UIInterfaceOrientationIsLandscape(oritentation)) {
   
        _colorViewHeightConstraint.priority = UILayoutPriorityDefaultLow;
        _colorViewBottomConstraint.priority = UILayoutPriorityDefaultHigh;
        _colorViewTrailingConstraint.priority = UILayoutPriorityDefaultLow;
        _colorViewWidthConstraint.priority = UILayoutPriorityDefaultHigh;
        
        _grayViewTopToColorViewConstraint.priority = UILayoutPriorityDefaultLow;
        _grayViewTopToSuperViewConstraint.priority = UILayoutPriorityDefaultHigh;
        _grayViewLeadingToSuperViewConstraint.priority = UILayoutPriorityDefaultLow;
        _grayViewLeadingToColorViewConstraint.priority = UILayoutPriorityDefaultHigh;
    }
}

PS:總覺得這里要寫的改變約束的代碼有點啰嗦,不過確實是提供了另一種不同的思路肚菠。

0x02.0x03 基于Sizeclass(iOS8及其之后)

iOS8之后可以愉快地使用SizeClass進行布局了舔箭,不過這不是本文分享的重點,感興趣的朋友自行Google吧蚊逢。如果能夠說服產(chǎn)品經(jīng)理不再兼容iOS7,就可以統(tǒng)一使用SizeClass+Autolayout進行布局了层扶。

通過幾個簡單的例子,本文給橫豎屏適配方案提供了一些思路烙荷,實際的業(yè)務場景復雜多變镜会,還需在實踐中靈活運用。本文所有的代碼可以在github上獲取到终抽,地址后續(xù)會補充上來

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戳表,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昼伴,更是在濱河造成了極大的恐慌匾旭,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃郊,死亡現(xiàn)場離奇詭異价涝,居然都是意外死亡,警方通過查閱死者的電腦和手機持舆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門飒泻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞭光,“玉大人,你說我怎么就攤上這事泞遗。” “怎么了席覆?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵史辙,是天一觀的道長。 經(jīng)常有香客問我佩伤,道長聊倔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任生巡,我火速辦了婚禮耙蔑,結果婚禮上,老公的妹妹穿的比我還像新娘孤荣。我一直安慰自己甸陌,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布盐股。 她就那樣靜靜地躺著钱豁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疯汁。 梳的紋絲不亂的頭發(fā)上牲尺,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音幌蚊,去河邊找鬼谤碳。 笑死,一個胖子當著我的面吹牛溢豆,可吹牛的內(nèi)容都是我干的蜒简。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼沫换,長吁一口氣:“原來是場噩夢啊……” “哼臭蚁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讯赏,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垮兑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漱挎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系枪,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年磕谅,在試婚紗的時候發(fā)現(xiàn)自己被綠了私爷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雾棺。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衬浑,靈堂內(nèi)的尸體忽然破棺而出捌浩,到底是詐尸還是另有隱情,我是刑警寧澤工秩,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布尸饺,位于F島的核電站,受9級特大地震影響助币,放射性物質(zhì)發(fā)生泄漏浪听。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一眉菱、第九天 我趴在偏房一處隱蔽的房頂上張望迹栓。 院中可真熱鬧,春花似錦俭缓、人聲如沸克伊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽答毫。三九已至,卻和暖如春季春,著一層夾襖步出監(jiān)牢的瞬間洗搂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工载弄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耘拇,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓宇攻,卻偏偏與公主長得像惫叛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逞刷,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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