一、UIViewController的automaticallyAdjustsScrollViewInsets属性
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets;// Defaults to YES
API_DEPRECATED("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0))
UIViewController的一个属性:(iOS7.0引入,11.0废除,之后其作用被UIScrollView的新属性contentInsetAdjustmentBehavior所取代,如设置为UIScrollViewContentInsetAdjustmentAutomatic等);
作用:默认情况下,它可以保证滚动视图的内容自动偏移,不会被UINavigationBar与UITabBar遮挡。
简要说明:
UINavigationBar与UITabBar默认都是半透明模糊效果,在这种情况下系统会对视图控制器的UI布局进行优化:当视图控制器里面【第一个】被添加进去的视图是UIScrollView或其子类时,系统会自动调整其内边距属性contentInset,以保证滑动视图里的内容不被UINavigationBar与UITabBar遮挡。
(一)、automaticallyAdjustsScrollViewInsets为YES时(即默认情况):
(A).UINavigationBar与UITabBar的translucent属性为YES(也即默认情况下)
//UITextView是滑动视图,内容自动向下偏移,不会被导航栏覆盖
//leftTextView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
UITextView *leftTextView = [[UITextView alloc] init];
leftTextView.frame = CGRectMake(0, 0,100, 736);
leftTextView.backgroundColor = [UIColor lightGrayColor];
leftTextView.text = @"君不见,黄河之水天上来,奔流到海不复回。君不见,高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽空对月。天生我材必有用,千金散尽还复来。";
leftTextView.font = [UIFont systemFontOfSize:18];
leftTextView.editable = NO;
[self.view addSubview:leftTextView];
//UIView是非滑动视图,内容被导航栏部分覆盖
UIView *rightView= [[UIView alloc] initWithFrame:CGRectMake(150, 0, 100, 100)];
rightView.backgroundColor = [UIColor redColor];
[self.view addSubview:rightView];
结论:UITextView未被遮挡,rightView被遮挡,这是最常见的情况。
(B).UINavigationBar与UITabBar的translucent属性为NO时:
结论:UITextView未被遮挡,rightView也未被遮挡。
总结:默认情况下,滚动视图的内容不会被UINavigationBar与UITabBar所遮挡,其contentInset会自动调整;非滚动视图会不会被遮挡,取决于UINavigationBar与UITabBar是否半透明。
(二)、设置automaticallyAdjustsScrollViewInsets为NO时:
(A).UINavigationBar与UITabBar的translucent属性为YES(也即默认情况下)
结论:UITextView被遮挡,rightView也被遮挡。
(B).UINavigationBar与UITabBar的translucent属性为NO时:
结论:UITextView未被遮挡,rightView也未遮挡。
总结:设置automaticallyAdjustsScrollViewInsets为NO时,滚动视图被视为普通的view,其内容会不会被UINavigationBar与UITabBar所遮挡取决于UINavigationBar与UITabBar是否半透明:半透明:会被遮挡;不透明,不会被遮挡。(额。。。貌似UITableView例外,如论如何,其内容都不会遮挡。。。)
综上所述
automaticallyAdjustsScrollViewInsets的设置只对滚动视图有效,对普通的view无效;对普通view而言,UINavigationBar与UITabBar半透明:会被遮挡;不透明,不会被遮挡。如果两个都是默认情况下,则滚动视图的内容不会被遮挡,普通的view会被遮挡,这是最常见的情况。
二、UIViewController的edgesForExtendedLayout属性
typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
UIRectEdgeNone = 0,
UIRectEdgeTop = 1 << 0,
UIRectEdgeLeft = 1 << 1,
UIRectEdgeBottom = 1 << 2,
UIRectEdgeRight = 1 << 3,
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight
} NS_ENUM_AVAILABLE_IOS(7_0);
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
edgesForExtendedLayout:边缘延伸属性,默认为UIRectEdgeAll。它也是视图控制器的布局属性,默认值是UIRectEdgeAll,即:当前视图控制器里各种UI控件【本身】(而非内容)会忽略导航栏和标签的存在,布局时若设置其原点设置为(0,0),视图会延伸显示到导航栏的下面被覆盖;其值为UIRectEdgeNone意味着子控件本身会自动躲避导航栏和标签栏,以免被遮挡。
self.edgesForExtendedLayout = UIRectEdgeNone;
三、导航栏的translucent属性
@property(nonatomic,assign,getter=isTranslucent) BOOL translucent NS_AVAILABLE_IOS(3_0) UI_APPEARANCE_SELECTOR;
// Default is NO on iOS 6 and earlier. Always YES if barStyle is set to UIBarStyleBlackTranslucent
默认为YES,意味着子控件以(0,0)点为坐标系布局;
设置为NO时,意味着子控件以(0,64)点为坐标系布局(不太准确,应为导航栏左下角为坐标系原点);
self.navigationController.navigationBar.translucent = NO;