在 iOS 7 中,如果某個(gè) UIViewController 的 self.view 第一個(gè)子視圖是 UIScollView, 同時(shí)當(dāng)這個(gè) UIViewController 被 push 或 initWithRootController 成為 UINavigationController控制的Controller時(shí),這個(gè) UIViewController的 view 的子視圖 UIScollView 的所有子視圖, 都會(huì)被下移 64px。
成都創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比青田網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式青田網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋青田地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴(lài)。
這個(gè)下移 64px 的前提是 navigationBar 和 statusBar 沒(méi)有隱藏。因?yàn)闉?statusBar 默認(rèn)的 Height 是 20px,而 navigatiBar 默認(rèn)的 Height 是 44px。下面來(lái)比較一下
實(shí)例:
不使用導(dǎo)航的界面跳轉(zhuǎn)
1. 在 AppDelegate.m 文件中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
//下面兩行為增加的代碼
ViewController *rootViewController = [[ViewController alloc] init];
[self.window setRootViewController:rootViewController];
[self.window makeKeyAndVisible];
return YES;
}
2. 在 ViewController.m 中:
- (void)viewDidLoad
{
[super viewDidLoad];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0, 64.0, 260.0, 300.0)];
[scrollView setBackgroundColor:[UIColor redColor]];
UIView *view = [[UIView alloc] initWithFrame:scrollView.bounds];
[view setBackgroundColor:[UIColor blueColor]];
[scrollView addSubview:view];
[self.view addSubview:scrollView];
}
3. 運(yùn)行后的結(jié)果:
這種情況下,scrollView并未受影響。
4. 現(xiàn)在使用 UINavigationController, 將開(kāi)始 AppDelegate.m 增加的那兩行代碼修改成:
ViewController *rootViewController = [[ViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.window setRootViewController:navController];
5. 現(xiàn)在再次運(yùn)行程序:
如結(jié)果顯示, scrollView 背景色為藍(lán)色的子視圖位置自動(dòng)下移了。 而這個(gè)下移的距離剛好是 64.0px。
解決方法:
第一種:在 ViewController 的 init 的方法中增加一行代碼:
self.automaticallyAdjustsScrollViewInsets = NO;
第二種: 讓UIScrollView 不要成為 ViewController 的 View 的第一個(gè)子視圖。具體操作:將 viewDidLoad方法 修改成如下:
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *firstSubView = [[UIView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:firstSubView];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0, 64.0, 260.0, 300.0)];
[scrollView setBackgroundColor:[UIColor redColor]];
UIView *view = [[UIView alloc] initWithFrame:scrollView.bounds];
[view setBackgroundColor:[UIColor blueColor]];
[scrollView addSubview:view];
[self.view addSubview:scrollView];
}
第三種:將 UIScorllView 的子視圖上移 64.0px 。修改 viewDidLoad 方法:
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0, 64.0, 260.0, 300.0)];
[scrollView setBackgroundColor:[UIColor redColor]];
CGRect viewFrame = CGRectMake(0, -64.0, CGRectGetWidth(scrollView.frame),
CGRectGetHeight(scrollView.frame));
UIView *view = [[UIView alloc] initWithFrame: viewFrame];
[view setBackgroundColor:[UIColor blueColor]];
[scrollView addSubview:view];
[self.view addSubview:scrollView];
第四種:設(shè)置導(dǎo)航欄的透明屬性。
self.navigationController.navigationBar.translucent =YES
改變導(dǎo)航欄透明度,也會(huì)影響,這個(gè)可以根據(jù)自己的實(shí)際需求進(jìn)行調(diào)整。d