AutoLayout对 scrollview的contentSize 和contentOffset属性的影响
AutoLayout对 scrollview的contentSize 和contentOffset属性的影响
问题一、iOS开发中,如果在XIB文件中创建一个scrollview,同时给它设置布局限制,然后在viewDidload方法设置它的contentSize,仍然不能滚动?
应该就是勾选了AutoLayout选项导致的。因为在AutoLayout下,iOS计算scrollview的contentsize的机制是略有不同的。
在AutoLayout下,会在viewDidAppear之前根据subview的constraint重新计算scrollview的contentsize。 这就是为什么,在viewDidload里面手动设置了contentsize没用。因为在后面,会再重新计算一次,前面手动设置的值会被覆盖掉。
解决办法有以下三种:
1.去除AutoLayout选项,自己手动设置contentSize。如 self.scrollView.contentSize = CGSizeMake(1200, 1200);
2.如果要使用AutoLayout,要么自己设置完subview的constraint,然后让系统自动根据constraint计算出contentSize。
如 self.scrollView.contentSize = self.imgView.frame.size;
3.要么就在viewDidAppear里面自己手动设置contentsize。
另外,设置scrollView的初始偏移量contentOffset也会受到AutoLayout影响,在viewDidLoad中设置的偏移量,因受AutoLayout影响,在viewDidAppear方法中会被归(0,0),此问题见以下代码,可参考以上3种方法进行解决。
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"viewDidLoad");
//设置scrollciew内容大小
self.scrollView.contentSize = self.imgView.frame.size;
//在viewDidLoad中做一次偏移(在viewDidAppear方法中,偏移会被归0)
[self printOffset];
self.scrollView.contentOffset = CGPointMake(-200, -200); //结构体作为属性时必须整体赋值,不可以单个修改结构体成员(这是OC的规定)
[self printOffset];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
NSLog(@"viewDidAppear");
//在viewDidAppear中做一次偏移((但在viewDidAppear方法中,偏移会被归0))
[self printOffset];
CGPoint origin = CGPointMake(-100, -100);
self.scrollView.contentOffset = origin; //结构体作为属性时必须整体赋值,不可以单个修改结构体成员(这是OC的规定) [self printOffset];
}
打印结果如下:
2016-04-08 12:20:07.181 6.0 UIScrollView常用属性[874:61590] viewDidLoad
2016-04-08 12:20:07.182 6.0 UIScrollView常用属性[874:61590] offset: {0, 0}
2016-04-08 12:20:07.182 6.0 UIScrollView常用属性[874:61590] offset: {-200, -200}
2016-04-08 12:20:07.257 6.0 UIScrollView常用属性[874:61590] viewDidAppear
2016-04-08 12:20:07.257 6.0 UIScrollView常用属性[874:61590] offset: {0, 0}
2016-04-08 12:20:07.257 6.0 UIScrollView常用属性[874:61590] offset: {-100, -100}
问题二、iOS开发: 解决UIScrollView不滚动的问题
照着书上的Demo(iOS 5.0的教程),在- (void)viewDidLoad里设置scrollView的contentsize,让它大于屏幕的高度,却发现在模拟器中没用,还是不能滚动。经过一翻搜索发现,这是因为iOS 6.0中新增的AutoLayout机制引起的,viewDidLoad后,AutoLayout会再一次把scrollView的contentSize设为屏幕的宽高,所以,我们的设置就无效了。
解决方法:把设置ContentSize的代码放到viewDidAppear里。
- -(void)viewDidAppear:(BOOL)animated
- {
- [super viewDidAppear:animated];
- [_scrollView setContentSize:CGSizeMake(500, 1800)];
- }
关于网上很多博客写着“结构体类型里面的某个属性如果想要修改是不允许单个修改的” 之解释:
其实并不是说结构体的成员就一定不能单个修改,例如在某方法中单独定义一个结构体类型的临时变量,是可以对它的成员直接进行修改的。
只是结构体在作为OC对象的属性使用时,OC语法规定不能单独对结构体属性的单个成员进行修改,要改必须通过对对象的结构体属性整体赋值,这样做也确保数据的完整性。
AutoLayout对 scrollview的contentSize 和contentOffset属性的影响的更多相关文章
- contentSize、contentInset和contentOffset 是 scrollView三个基本的属性区别和使用
contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: 其实就是scrollview可以滚动的区域,比如fra ...
- iOS开发之 UIScrollView的frame、contentSize、contentOffset和contentInset属性
ios中下拉图片变大效果 http://blog.csdn.net/mad2man/article/details/14169197 IOS中UIScrollView的frame.contentSiz ...
- IOS中UIScrollView的contentSize、contentOffset和contentInset属性
IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属 性,同时, ...
- UIScrollView的contentSize、contentOffset和contentInset属性
IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属性,同时,U ...
- contentInset,contentsize和contentOffset区别
contentInset,contentsize和contentOffset区别 今天看别人用到了contentInset,觉得很迷糊,于是gogle了一下,搜到了一篇分析的很好的文章,转在这里, ...
- PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...
- ContentSize、Contentoffset以及ContentInset属性
ContentSize UIScrollView可以滚动的区域.在我的理解中,我把UIScrollView看成是具有上下两层的一个复合视图,frame控制着上层的大小,我们看到的UIScrollVie ...
- ScrollView不设置contentSize属性依然也可以作为底层滚动View(使用masonry设置scrollView的contentSize)
第一步 //下层的scroolView self.baseScrollView = [[UIScrollView alloc] init]; self.baseScrollView.delegate ...
- UIScrollView的contentSize与contentOffset
UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应. ...
随机推荐
- java对象中含有Integer类型字段转json字符串问题
问题:对于含有Integer类型字段的java对象,在通过下面这种方式转为json字符串时,Integer类型的字段如果为空的情况下,会默认转化为0,但是我想让它为空的时候直接转化为null,不要默认 ...
- 获取指定包名下继承或者实现某接口的所有类(扫描文件目录和所有jar)
import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.net.JarURLCo ...
- SZU4
#include <iostream> #include <string> #include <cstring> #include <cstdlib> ...
- wget http://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz 下载时报错 ssl is required 解决办法
方法一:使用浏览器下载.在浏览器中输入 http://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz 方法二:将h ...
- SPOJ QTREE5
题意 一棵\(n\)个点的树,点从\(1\)到\(n\)编号.每个点可能有两种颜色:黑或白. 我们定义\(dist(a,b)\)为点\(a\)至点\(b\)路径上的边个数. 一开始所有的点都是黑色的. ...
- MySQL行(记录)详细操作
一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...
- chrome调试工具DevTools的使用 以及 localhost在移动端不能访问的问题
1.手机和pc 都需要装 chrome浏览器 2.手机端打开开发者模式和usb调试 (华为nova的手机小坑,需要选择usb 配置为可传输文件的状态) 3.经过以上操作打开chrome://inspe ...
- .NET开源工作流RoadFlow-流程运行-管理员干预
在流程运行过程中管理员可以干预流程实例的走向,如管理加强制退回,指派和删除流程实例操作.在 流程管理-->实例管理 中查找到相应的流程实例,点击管理按钮即可管理该流程实例: 点击指派按钮,选择要 ...
- PHP中empty、isset和is_null的使用区别
关于PHP中empty().isset() 和 is_null() 这三个函数的区别,之前记得专门总结过,上次又被问到,网上已经很多,就用几个例子来说明: 测试用例选取: <?php $a;$b ...
- Python语言下图像的操作方法总结
本章主要讲解 图像的读取方式.灰度化操作.图像转化为矩阵的方法 假设 strImgPath是图像的路径, img对象将图片读入到内存中 读取图像的第一种方式:skImage from skimage ...