您好,登錄后才能下訂單哦!
在 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 文件中:
- (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. 運行后的結果:
這種情況下,scrollView并未受影響。
4. 現在使用 UINavigationController, 將開始 AppDelegate.m 增加的那兩行代碼修改成:
ViewController *rootViewController = [[ViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.window setRootViewController:navController];
5. 現在再次運行程序:
如結果顯示, scrollView 背景色為藍色的子視圖位置自動下移了。 而這個下移的距離剛好是 64.0px。
解決方法:
第一種:在 ViewController 的 init 的方法中增加一行代碼:
self.automaticallyAdjustsScrollViewInsets = NO;
第二種: 讓UIScrollView 不要成為 ViewController 的 View 的第一個子視圖。具體操作:將 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];
第四種:設置導航欄的透明屬性。
self.navigationController.navigationBar.translucent = YES
改變導航欄透明度,也會影響,這個可以根據自己的實際需求進行調整。d
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。