UI中的导航切换影响UIScrollView的问题


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.0, 260.0, 300.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. 运行后的结果:

这种情况下,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. 现在再次运行程序:

如结果显示, 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.0, 260.0, 300.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.0, 260.0, 300.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

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

时间: 2024-11-16 21:32:46

UI中的导航切换影响UIScrollView的问题的相关文章

ios7 导航控制器切换影响UIScrollView布局的问题

在 iOS 7 中,如果某个 UIViewController 的 self.view 第一个子视图是 UIScollView, 同时当这个 UIViewController 被 push 或 initWithRootController 成为 UINavigationController控制的Controller时,这个 UIViewController的 view 的子视图 UIScollView 的所有子视图, 都会被下移 64px. 这个下移 64px 的前提是 navigationBa

[Win10]1 WPF和WP8 Silverlight中的导航问题

一.Frame.Page框架的相关介绍 1.Frame类: 继承层次结构 System.Object   System.Windows.Threading.DispatcherObject     System.Windows.DependencyObject       System.Windows.Media.Visual         System.Windows.UIElement           System.Windows.FrameworkElement           

【UI控件总结】【UIScrollView】深入理解篇UIScrollerView

[UI控件总结][UIScrollView]基本方法+基本描述 接下来,我整理一下自己的思路,深入理解 UIScrollView 基本点 : 1 . UIScrollView 是一个UIView. 每个UIView都有一个bounds和frame.当布局一个界面时,我们需要处理视图的frame.这允许我们放置并设置视图的大小. 视图的frame和bounds的大小总是一样的,但是他们的origin有可能不同(bounds的原点是(0,0)点(就是view本身的坐标系统,默认永远都是0,0点,除非

iOS 7 教程:定制iOS 7中的导航栏和状态栏

目录(?)[-] iOS 7中默认的导航栏 设置导航栏的背景颜色 在导航栏中使用背景图片 定制返回按钮的颜 修改导航栏标题的字体 修改导航栏标题为图片 添加多个按钮 修改状态栏的风格 隐藏状态栏 总结 注:本文译自Customizing Navigation Bar and Status Bar in iOS 7 近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这

【React Native开发】React Native控件之DrawerLayoutAndroid抽屉导航切换组件讲解(13)

转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50599951 本文出自:[江清清的博客] (一)前言 今天我们一起来看一下抽屉DrawerLayoutAndroid导航切换控件的讲解与基本使用. 刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同时博客左侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送! 该DrawerLayout

WPF和WinRT中的导航问题

 一.Frame.Page框架的相关介绍 1.Frame类: 继承层次结构 System.Object System.Windows.Threading.DispatcherObject System.Windows.DependencyObject System.Windows.Media.Visual System.Windows.UIElement System.Windows.FrameworkElement System.Windows.Controls.Control Syste

iOS 7中的导航栏和状态栏

iOS 7中默认的导航栏 在开始定制之前,我们先来看看iOS 7中默认导航栏的外观.通过Xcode用Single View Controller模板创建一个工程.然后将view controller嵌入到一个navigation controller中.如果你不想从头开始,那么也可以在这里下载到这个 示例工程.Xcode 5包含有iOS 6和iOS 7模拟器,我们可以在这两个不同的模拟器版本中运行示例程序,进行对比,如下图所示: 如上图所示,在iOS 7中的导航栏默认情况下跟状态栏是交织在一起的

JQuery UI中的Tabs与base元素摩擦的BUG

JQuery UI中的Tabs与base元素冲突的BUG 以前一直使用jquery-ui-1.8,最近打算试一下目前最新的版本1.11.但对于Tabs,页面是乱的,怎么也不正常.折腾了好几个小时,最后发现页面中使用的base元素,对Tabs有破坏性的影响. 没有想清楚具体的原因,先记下来再说吧. 到了晚上,又想起这个问题.这个问题实在讨厌,我的系统中所有页面中都使用了base元素,不解决这个冲突实在是不爽.经过几个小时的跟踪调试,终于发现的问题所在: 新版本的jquery UI中,Tabs的代码

定制iOS 7中的导航栏和状态栏

本文转载至 http://www.cocoachina.com/industry/20131104/7287.html 跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这也 “” 阅读器 近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这