一溺蕉、探討navigation布局問題
看下這三個屬性的影響:
1该面、edgesForExtendedLayout
2骗奖、extendedLayoutIncludesOpaqueBars
3、translucent
edgesForExtendedLayout布局的屬性:
1腮出、 默認(rèn)情況下:UIRectEdgeAll布局從(0幻妓,0)開始
2蹦误、設(shè)置為:UIRectEdgeNone布局從(0劫拢,64)開始
- (void)viewDidLoad {
[super viewDidLoad];
self.edgesForExtendedLayout = UIRectEdgeNone;
}
小結(jié):iOS6以前布局是從導(dǎo)航欄(0,64)開始的强胰,iOS7之后實現(xiàn)扁平化效果舱沧,布局就從四周邊距(0,0)開始偶洋,這個屬性是決定view的整體布局,他是把整個view整體偏移熟吏。一定要先理解這個屬性的含義,不然后面會混淆玄窝。
translucent影響布局屬性
1牵寺、默認(rèn)情況布局translucent = YES 從(0,0)開始
2恩脂、 translucent為不透明情況布局從(0帽氓,64)開始
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = NO;
}
小結(jié):系統(tǒng)默認(rèn)是透明的,布局從(0俩块,0)開始黎休,當(dāng)設(shè)置為不透明時:布局便從(0,64)開始玉凯。此時self.edgesForExtendedLayout屬性失效势腮。優(yōu)先級順序 translucent>edgesForExtendedLayout。如果一定要在不透明的情況下從(0漫仆,0)開始布局呢捎拯,這就引出了第三個屬性。
extendedLayoutIncludesOpaqueBars影響布局
1歹啼、默認(rèn)情況下玄渗,在導(dǎo)航欄不透明情況座菠,extendedLayoutIncludesOpaqueBars默認(rèn)是NO狸眼。布局便從(0,64)開始
2浴滴、為YES情況下 布局便從(0拓萌,0)開始
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
self.navigationController.navigationBar.translucent = NO;
self.extendedLayoutIncludesOpaqueBars = YES;
}
小結(jié):這個屬性是在導(dǎo)航欄不透明的情況下是否要延伸布局區(qū)域。
總結(jié):重要:優(yōu)先級順序 extendedLayoutIncludesOpaqueBars >translucent>edgesForExtendedLayout升略。
二微王、影響scrollview布局因素
了解上面三個屬性的作用和差別后,我們來探討一下布局view和scrollview時品嚣,在這三個屬性作用下會有什么不同炕倘。
1、在view上面添加子View
這種情況比較簡單翰撑,子view的布局只是受父view的影響罩旋。
2、在view上面添加scrollview(這種情況比較特殊,但是也不難理解涨醋,它主要是影響scrollview的contentView)
-
edgesForExtendedLayout屬性影響
1)導(dǎo)航欄透明瓜饥,默認(rèn)情況UIRectEdgeAll
我們在view上面添加一個黃色的scrollview,然后在scrollview上面添加一個藍(lán)色的blue.
- (void)viewDidLoad {
[super viewDidLoad];
UIScrollView *subview = [[UIScrollView alloc] initWithFrame:self.view.bounds];
subview.backgroundColor = [UIColor yellowColor];
[self.view addSubview:subview];
UIView *scrollviewSubView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
scrollviewSubView.backgroundColor = [UIColor blueColor];
[subview addSubview:scrollviewSubView];
}
小結(jié):我們可以看到藍(lán)色的view布局從(0,64)開始浴骂,從打印的結(jié)果看乓土,scrollview的frame是從(0,0)開始的溯警,只是他的contentOffset(0趣苏,-64)開始。也就是說梯轻,是scrollview的內(nèi)容偏移了拦键。
2)導(dǎo)航欄透明情況,UIRectEdgeNone
小結(jié):scrollview的frame(0,0)檩淋,contentOffset也是(0芬为,0)沒有出現(xiàn)偏移現(xiàn)象。
-
translucent 屬性影響
1)透明情況和上面UIRectEdgeAll一樣
2)不透明情況和上面UIRectEdgeNone一樣
-
extendedLayoutIncludesOpaqueBars 屬性影響
1)extendedLayoutIncludesOpaqueBars = NO蟀悦,上面UIRectEdgeNone一樣
- extendedLayoutIncludesOpaqueBars = YES,和上面UIRectEdgeAll一樣
總結(jié):從上面的情況我們可以得出結(jié)論媚朦,如果scrollview布局從導(dǎo)航欄下面開始(也就是被遮擋了),則scrollview的內(nèi)容會自動偏移contentOffset(0日戈,-64).那如果不需要scrollview偏移呢询张,這就引出下面的屬性。
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES