迁移 http://aikin.me/2014/03/16/ios7-uinavigationcontroller-uiview/
在 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. 运行后的结果:
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];
相关推荐
"IOS7 UINavigationController滑动Demo"就是针对这一功能的示例项目,旨在解决在pushViewController后,用户可以在新的页面上通过滑动来返回前一个页面的问题。 在iOS 7中,苹果对UINavigationController的滑动手势...
在iOS应用开发中,页面间的跳转是用户体验的重要组成部分,而`UINavigationController`是苹果提供的一个强大工具,用于管理屏幕间的导航...正确理解和使用`UINavigationController`,将有助于构建高效、流畅的iOS应用。
首先,UINavigationController在iOS 7中引入了一个显著的变化,即默认的透明背景效果。在之前的版本中,navBar通常是不透明的,但在iOS 7中,navBar的背景变为完全透明,这样可以让内容视图无缝地延伸到导航栏之下,...
导航控制器(UINavigationController)用来管理一系列显示层次型信息的场景。一般而言,逐步显示更详细的信息。 导航控制器 -- 用户在场景之间切换时,导航控制器依次将视图控制器压入(push)堆栈中,且当前场景的...
在iOS应用开发中,`UINavigationController`和`UITabBarController`是两个核心的控制器,用于构建常见的用户界面结构。它们分别是导航栈和标签页切换器,但有时开发者可能需要根据应用的需求进行定制,以实现独特的...
效果参考 App:腾讯新闻、百度音乐等等 GitHub:https://github.com/LeoiOS/LCNavigationController
IOS 导航 UINavigationController,说明了setBackBarButtonItem,setRightBarButtonItem,setLeftBarButtonItem,setTitleView
本示例代码“UINavigationController Demo”将深入讲解如何在iOS应用中有效地使用`UINavigationController`,以及它与导航栏(`UINavigationBar`)的交互。 首先,`UINavigationController`是`UIViewController`的...
在iOS应用开发中,`UINavigationController`是苹果提供的一个核心组件,用于管理多个`UIViewController`的堆栈,实现页面间的导航。本篇文章将深入探讨如何对`UINavigationController`进行自定义,特别是关于...
在Android开发中,为了提供与iOS类似的用户体验,开发者有时会希望实现类似iOS的UINavigationController的滑动手势来完成Activity的返回操作。标题提到的"SwipetoFinishActivity"就是一个这样的解决方案,它允许用户...
在iOS开发中,`UINavigationController`是苹果提供的一种强大的视图控制器容器,它负责管理一个堆栈式的视图控制器序列,通常用于实现页面间的导航。本篇将深入讲解`UINavigationController`的页面切换机制以及如何...
很多时候我们创建一个基于UITabBarController的application以后还希望能够在每个tab view都可以实现导航控制,即添加一个UINavigationController来实现tabview内部的view之间的切换,这即是本文所要介绍的。
在Swift编程语言中,控制器(Controller)的跳转是iOS应用开发中的常见操作,它涉及到UI导航流程的设计。Swift 5.2版本虽然在语法上没有显著改变这一部分,但理解如何正确地进行控制器的跳转和删除对于构建用户友好...
这个话题将深入探讨如何使用纯代码方式来搭建一个包含三级结构的UI,即`UITabBarController` + `UINavigationController` + `UIViewController`。这个结构常用于大型应用,因为它提供了良好的导航和组织用户内容的...
在iOS开发中,自定义导航控制器UINavigationController是一个常见的需求,以满足特定的界面设计和交互体验。本篇文章将深入探讨如何实现自定义导航控制器,并基于提供的代码片段进行解析。 首先,自定义导航控制器...
这个压缩包"IOS应用源码之ios适用于iOS 5、iOS 6和iOS 7的自定义NavigationBar.zip"显然包含了适用于这三个不同版本iOS的自定义导航栏实现。下面将详细解释相关知识点。 1. 自定义`UINavigationBar`: - `...
iOS开发在编程领域一直备受关注,特别是苹果公司推出新一代iOS7操作系统后,开发者需要掌握更多新的技术和编程技巧,以便能够创建出更加丰富、交互性更强的应用程序。《iOS的7编程食谱》一书是Vandad Nahavandipoor...
iOS 7引入了Auto Layout和Size Classes,用于实现屏幕尺寸和方向变化的响应式布局。Auto Layout允许开发者定义视图之间的约束关系,而Size Classes则提供了一种方式来管理不同屏幕尺寸下的布局。通过分析源代码,...
UITabBarController和UINavigationController的整合使用DEMO,详情见:http://blog.csdn.net/hwe_xc/article/details/50588500
在iOS 5、iOS 6和iOS 7中,虽然`UINavigationController`的`navigationBar`默认样式有一定程度的统一,但设计趋势和Apple的设计指南随着时间变化而变化。在iOS 5中,导航栏默认是透明的背景,而在iOS 6中引入了新的...