automaticallyAdjustsScrollViewInsets客冈,當設(shè)置為YES時(默認YES)旭从,如果視圖里面存在唯一一個UIScrollView或其子類View,那么它會自動設(shè)置相應(yīng)的內(nèi)邊距场仲,這樣可以讓scroll占據(jù)整個視圖和悦,又不會讓導(dǎo)航欄遮蓋。
當controller上的第一個子視圖不是scrollview以及其子類的時候渠缕,就會取消內(nèi)邊距摹闽。此時原本全屏的scrollview設(shè)置的frame(0,0褐健,self.view.frame.size.width付鹿,xx)就會從狀態(tài)欄開始算起澜汤,如果應(yīng)用有導(dǎo)航欄的話,那么就會遮蓋住視圖的64個高度
解決方案:
- self.automaticallyAdjustsScrollViewInsets = NO舵匾;禁用掉自動設(shè)置的內(nèi)邊距俊抵,自行控制controller上index為0的控件以及scrollview控件的位置
- self.edgesForExtendedLayout = UIExtendedEdgeNone;這種方式設(shè)置,不需要再重新設(shè)置index為0的控件的位置以及scrollview的位置坐梯,(0徽诲,0)默認的依然是從導(dǎo)航欄下面開始算起
1、edgesForExtendedLayout
從iOS7開始吵血,view controllers默認使用全屏布局(full-screen layout)谎替。同時引進了不少屬性,使你能更自由地控制view controllers如何布局views
通過設(shè)置此屬性蹋辅,可以設(shè)定view的邊(上钱贯、下、左侦另、右)延伸到整個屏幕秩命。
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
typedef enum : NSUInteger {
UIRectEdgeNone = 0,
UIRectEdgeTop = 1 << 0,
UIRectEdgeLeft = 1 << 1,
UIRectEdgeBottom = 1 << 2,
UIRectEdgeRight = 1 << 3,
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
} UIRectEdge;
edgesForExtendedLayout屬性是enum類型UIRectEdge。默認值是UIRectEdgeAll, 意味著view會被拓展到整個屏幕褒傅。比如弃锐,當你把一個UIViewControllerpush到一個UINavigationController上:
例子:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor=[UIColor greenColor];
}
由此可見ViewController的view延伸到導(dǎo)航欄和狀態(tài)欄里面,如果將self.edgesForExtendedLayout = UIRectEdgeNone;view就不會延伸到導(dǎo)航欄和狀態(tài)欄里面
2殿托、automaticallyAdjustsScrollViewInsets
如果view是UIScrollerView或其子類(UITableView)時,設(shè)置 self.edgesForExtendedLayout = UIRectEdgeNone;此時UIScrollerView或其子類仍然會被導(dǎo)航欄和狀態(tài)欄覆蓋霹菊,此時應(yīng)該設(shè)置automaticallyAdjustsScrollViewInsets=YES(默認也是YES).viewController會table頂部添加inset,所以table會出現(xiàn)在navigation bar的底部支竹。但是滾動時又能覆蓋整個屏幕: