ios7 中关于导航切换影响UIScrollView的问题


原文出自:http://8590847.blog.51cto.com/8580847/1385803


在 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代码  收藏代码
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  

  2. {  

  3.  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  

  4.  self.window.backgroundColor = [UIColor whiteColor];                                

  5.  //下面两行为增加的代码                                                          

  6.  ViewController *rootViewController = [[ViewController alloc] init];  

  7.  [self.window setRootViewController:rootViewController];  

  8.  [self.window makeKeyAndVisible];  

  9.    return YES;  

  10. }  



2. 在 ViewController.m 中:


Obj-c代码  收藏代码
  1. - (void)viewDidLoad  

  2. {  

  3. [super viewDidLoad];  

  4. UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0,                                                           64.0260.0300.0)];  

  5. [scrollView setBackgroundColor:[UIColor redColor]];  

  6. UIView *view = [[UIView alloc] initWithFrame:scrollView.bounds];  

  7. [view setBackgroundColor:[UIColor blueColor]];  

  8. [scrollView addSubview:view];  

  9. [self.view addSubview:scrollView];  

  10. }  


3. 运行后的结果:

wKioL1M02bjAygEmAABp-pZVp3I608.jpg


这种情况下,scrollView并未受影响。


4. 现在使用 UINavigationController,  将开始 AppDelegate.m 增加的那两行代码修改成:  



Obj-c代码  收藏代码
  1. ViewController *rootViewController = [[ViewController alloc] init];  

  2.  UINavigationController *navController = [[UINavigationController alloc]  

  3.                                 initWithRootViewController:rootViewController];  

  4.  [self.window setRootViewController:navController];  




5. 现在再次运行程序:

wKiom1M02uuD8SEiAAB48M0Pmhc504.jpg


如结果显示, scrollView 背景色为蓝色的子视图位置自动下移了。 而这个下移的距离刚好是 64.0px。


解决方法:

   第一种:在 ViewController 的 init 的方法中增加一行代码:



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



第二种: 让UIScrollView 不要成为 ViewController 的 View 的第一个子视图。具体操作:将 viewDidLoad方法 修改成如下:



Obj-c代码  收藏代码
  1. - (void)viewDidLoad  

  2. {  

  3. [super viewDidLoad];  

  4. UIView *firstSubView = [[UIView alloc] initWithFrame:self.view.bounds];  

  5. [self.view addSubview:firstSubView];  

  6. UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0,                                                           64.0260.0300.0)];  

  7. [scrollView setBackgroundColor:[UIColor redColor]];  

  8. UIView *view = [[UIView alloc] initWithFrame:scrollView.bounds];  

  9. [view setBackgroundColor:[UIColor blueColor]];  

  10. [scrollView addSubview:view];  

  11. [self.view addSubview:scrollView];  

  12. }  


第三种:将 UIScorllView 的子视图上移 64.0px 。修改 viewDidLoad 方法:



Obj-c代码  收藏代码
  1. UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0,                                                           64.0260.0300.0)];  

  2. [scrollView setBackgroundColor:[UIColor redColor]];  

  3. CGRect viewFrame = CGRectMake(0, -64.0, CGRectGetWidth(scrollView.frame),  

  4.                                                                                   CGRectGetHeight(scrollView.frame));  

  5. UIView *view = [[UIView alloc] initWithFrame: viewFrame];  

  6. [view setBackgroundColor:[UIColor blueColor]];  

  7. [scrollView addSubview:view];  

  8. [self.view addSubview:scrollView];  


第四种:设置导航栏的透明属性。

self.navigationController.navigationBar.translucent = YES

改变导航栏透明度,也会影响,这个可以根据自己的实际需求进行调整。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值