UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)
UINavigationController和UIScrollView是iOS下几种主要的交互元素,但当我搭配二者在一起时,UIScrollView的滚动区域出现了很诡异的现象。我希望UIScrollView横向可翻页,纵向与其frame等高不可滚动,但诡异的是:1、我把UIScrollView的contentSize设为和其frame高度相同,可结果是他总能上下滚动一小段。2、我在UIScrollView的(0, 0)位置创建一个子视图,运行时也总往下偏移几十个像素。
我的程序最初是这么写的:在story board中创建NavigationController(左),并使用默认的Root View Controller(中),这是一个TableViewController。再添加一个新的ViewController(右),并关联TableViewCell的点击操作到新的ViewController上,将此ViewController的RootView修改为UIScrollView,story board如下:

在新ViewController的viewDidLoad中添加如下代码:
@interface ViewController ()
// 将视图修改为UIScrollView,并为之创建outlet变量
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@end
…… - (void)viewDidLoad {
[super viewDidLoad];
// 设为翻页模式,并将contentSize设为frame两倍宽
self.scrollView.pagingEnabled = YES;
CGRect rect = self.scrollView.frame;
rect.size.width *= ;
self.scrollView.contentSize = rect.size;
}
得到的ScrollView如下,可以发现当我拖动的时候,横向和纵向都有滚动条。横向可以理解,纵向为什么也能滚动呢:

为了确认ScrollView内容的边界,我给它添加了两个子view,并分别设置成红色和蓝色背景:
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView.pagingEnabled = YES;
CGRect rect = self.scrollView.frame;
rect.size.width *= ;
self.scrollView.contentSize = rect.size;
// 添加红色和蓝色背景的子视图,横向排列
CGRect rtViewA = self.scrollView.bounds;
UIView *viewA = [[UIView alloc]initWithFrame:rtViewA];
viewA.backgroundColor = [UIColor redColor];
[self.scrollView addSubview:viewA];
CGRect rtViewB = self.scrollView.bounds;
rtViewB.origin.x = rtViewA.size.width;
UIView *viewB = [[UIView alloc]initWithFrame:rtViewB];
viewB.backgroundColor = [UIColor blueColor];
[self.scrollView addSubview:viewB];
}
得到的效果是这样的:

发现进入ScrollView时,初始状态貌似是正确的,可是稍微拖动就能发现异常:红色的view很容易被弹到顶部,NavigationBar的下方,而且弹上去之后,底部并没有留出空白,这说明viewA的尺寸不对。viewA的大小是比着ScrollView创建出来的,如果viewA的尺寸偏大,那是不是说明ScrollView的尺寸也偏大?
于是我打开Debug View Hierarchy,如下图,浅蓝色的是ScrollView,红色的是viewA,

打印出二者的信息:
Printing description of $:
<UIScrollView: 0x7fe7bb827200; frame = ( ; ); autoresize = W+H; gestureRecognizers = <NSArray: 0x7fe7b9f42f60>; layer = <CALayer: 0x7fe7b9f404e0>; contentOffset: {, -}; contentSize: {, }>
Printing description of $:
<UIView: 0x7fe7b9f28000; frame = ( ; ); layer = <CALayer: 0x7fe7b9f4a050>>
从log中看出viewA和scrollView等高,没问题。可是从Debug View Hierachy中清楚地看到scrollView的左上角是在window左上角原点,叠加在NavigationBar的底部,而不是排列在NavigationBar的下方!
难道是我的视图排列方式不规范?我怀疑是不是NavigationBar从属于RootView?因此想不被NavigationBar压住,就应该将RootView设为普通View,在它的下方再创建一个ScrollView子视图,也就是说让NavigationBar和ScrollView上下并排排列在RootView里面。接下来我会继续做实验来验证。
UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)的更多相关文章
- UINavigationController + UIScrollView组合,视图尺寸的设置探秘(三)
还是在苹果的 View Controller Catalog for iOS 文章中找到答案.文中提到了两点: 1.If the navigation bar or toolbar are visib ...
- UINavigationController + UIScrollView组合,视图尺寸的设置探秘(二)
承接上文,我想把view布局修改为如下模式,让ScrollView长在NavigationBar的下方,这总不会有遮挡的问题了吧: story board内容如下,主要是右侧视图蓝色区域添加了Scro ...
- bootstrap-datetimepicker年视图中endDate设置之后比正常时间提前两个月
问题 bootstrap-datetimepicker年视图中endDate设置结束时间为2016-08,(即8月之后的日期不能选)而在日历上显示时为2016-06,相差两个月,即6月之后的日期不能选 ...
- UIScrollView 滚动视图—IOS开发
转自:http://blog.csdn.net/iukey/article/details/7319314 UIScrollView 类负责所有基于 UIKit 的滚动操作. 一.创建 CGRect ...
- UIScrollView滚动视图
一.基本知识 1.初始化 UIScrollView #import "ViewController.h" #define WIDTH[[UIScreen mainScreen]bo ...
- iOS开发中的错误整理,(百思项目,指示器位置)设置控件尺寸和点坐标,先设置尺寸,再设置点坐标
之前对控件的尺寸和点的坐标的设置从来都是想到什么写什么,从来没有关心过顺序.然后就有了这次的血的教训!!!!! 下面是错误的截图,先设置的中心点,然后设置的宽度.程序运行就这样了,点别的没有毛病!!! ...
- 改良UIScrollView滚动视图
#define HEIGHT self.view.frame.size.height #define WIDTH self.view.frame.size.width @interface V ...
- WebGL或OpenGL关于模型视图投影变换的设置技巧
目录 1. 具体实例 2. 解决方案 1) Cube.html 2) Cube.js 3) 运行结果 3. 详细讲解 1) 模型变换 2) 视图变换 3) 投影变换 4) 模型视图投影矩阵 4. 存在 ...
- NX二次开发-将工程图视图+尺寸的最大边界导出图片
/***************************************************************************** ** ** ExportPicture.c ...
随机推荐
- C++空类大小
class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类 ...
- Web中的安全性问题
根据2010年OWASP发布的Web应用程序安全风险主要是SQL注入攻击.跨网站脚本.伪造客户端请求.Cookie盗取,传输层保护不足. 1 SQL注入攻击 随着B/S框架结构在系统开发中的广泛应用 ...
- STM32 -- 硬件知识
一.网站资源 1.http://www.stmcu.com.cn/ 二.硬件 1.BOOT0 和 BOOT1 1)一般BOOT0和BOOT1跳线都跳到0(地): 只是在ISP下载的情况下,BOO ...
- phyton方面相关书籍
0基础:<简明PYTHON教程>http://linux.chinaitlab.com/manual/Python_chinese/<与孩子一起学编程>http://book. ...
- Python:包、模块、类、函数的调用
一.关系 包一般指文件夹或者安装包(安装包一般也是压缩后的文件夹),里面包含多个.py文件(必须有一个__init__.py文件),一般也含有多个子包(或子文件夹): 一般一个.py文件就是一个模块, ...
- idea右键单击没有 svn选项处理办法
问题一: IntelliJ IDEA打开带SVN信息的项目不显示SVN信息,项目右键SVN以及图标还有Changes都不显示解决方法 在VCS菜单中有个开关,叫Enabled Version Cont ...
- MySQL 学习四 SQL优化
MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能. 第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图 第三层:存储引擎.负 ...
- RVO和NRVO
返回值优化(Return Value Optimization,简称RVO),是这么一种优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用户返回,那么这个临时对象会消耗一个构造函数(C ...
- redis学习五 集群配置
redis集群配置 0,整体概述 整体来说就是: 1,安装redis 2,配置多个redis实例 3,安装 ruby和rubygems 4,启动red ...
- javascript——正则表达式(RegExp、String)(未完工)
在 javascript 中,正则表达式由两部分组成:正则表达式的匹配模式文本:匹配模式文本的修饰符: 修饰符: 修饰符 说明 i 忽略大小写 g 执行全局匹配 m 执行多行匹配 匹配模式文本包括以下 ...