你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> ios7 導航控制器切換影響UIScrollView布局的問題

ios7 導航控制器切換影響UIScrollView布局的問題

編輯:IOS開發綜合
在 iOS 7 中,如果某個 UIViewController 的 self.view 第一個子視圖是 UIScollView, 同時當這個 UIViewController 被 push 或 initWithRootController 成為 UINavigationController控制的Controller時,這個 UIViewController的 view 的子視圖 UIScollView 的所有子視圖, 都會被下移 64px。
   這個下移 64px 的前提是 navigationBar 和 statusBar 沒有隱藏。因為為 statusBar 默認的 Height 是 20px,而 navigatiBar  默認的 Height 是 44px。下面來比較一下
實例:
   不使用導航的界面跳轉
    1. 在 AppDelegate.m 文件中:
Obj-c代碼 收藏代碼
- (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 中:

Obj-c代碼 收藏代碼
- (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. 運行後的結果:
wKioL1M02bjAygEmAABp-pZVp3I608.jpg

這種情況下,scrollView並未受影響。

4. 現在使用 UINavigationController,  將開始 AppDelegate.m 增加的那兩行代碼修改成:  


Obj-c代碼 收藏代碼
ViewController *rootViewController = [[ViewController alloc] init];  
 UINavigationController *navController = [[UINavigationController alloc]  
                                initWithRootViewController:rootViewController];  
 [self.window setRootViewController:navController];  



5. 現在再次運行程序:
wKiom1M02uuD8SEiAAB48M0Pmhc504.jpg

如結果顯示, scrollView 背景色為藍色的子視圖位置自動下移了。 而這個下移的距離剛好是 64.0px。

解決方法:
   第一種:在 ViewController 的 init 的方法中增加一行代碼:


Obj-c代碼 收藏代碼
self.automaticallyAdjustsScrollViewInsets = NO;  


第二種: 讓UIScrollView 不要成為 ViewController 的 View 的第一個子視圖。具體操作:將 viewDidLoad方法 修改成如下:


Obj-c代碼 收藏代碼
- (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 方法:


Obj-c代碼 收藏代碼
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];  

第四種:設置導航欄的透明屬性。
self.navigationController.navigationBar.translucent = YES
改變導航欄透明度,也會影響,這個可以根據自己的實際需求進行調整。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved