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实现了这些手势,并且替你处理对于它们的探测和回应. ...
随机推荐
- 网站SEO优化
网站的优化应该迎合搜索引擎,这样才能得到事半功倍的效果! 一.站内优化 1.做好HTML头标签 标题(title):标题是网页优化中相当有分量,一般网页title主要包含一些关键词.网站名称等.关键词 ...
- 数据上下文中的AddOrUpdate方法
AddOrUpdate是扩展方法,需要添加引用 using System.Data.Entity.Migrations;
- csharp:qq weather
using System; using System.Data; using System.Configuration; using System.Collections; using System. ...
- 爬虫之lxml - etree - xpath的使用
# 解析原理: # - 获取页面源码数据 # - 实例化一个etree对象,并且将页面源码数据加载到该对象中 # - 调用该对象的xpath方法进行指定标签定位 # - xpath函数必须结合着xpa ...
- 排序算法Nb三人组-快速排序
核心思想: 将列表中第一个元素拿出来,放到一边,左右两个循环,左面的大于拿出来的数,就把他挪到右面, 右面的小于拿出来的数就把他放在左面,这是列表被第一个元素''分''为两个列表,在对两个列表进行同样 ...
- 前端学习之路之CSS (二)
Infi-chu: http://www.cnblogs.com/Infi-chu/ id选择器id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式,CSS 中 id 选择器以 &quo ...
- 在URL里传入数组到HTML 里。
需求 静态页面根据URL输入,动态显示图表满足如下两个条件. 1. 隐藏指定的行 2. 设定初始显示的Check box 需要的部分被打勾 实现 1. 创建一个静态的页面, <table id= ...
- 常见的浏览器兼容性问题与解决方案——CSS篇
1.不同的浏览器的标签默认的外补丁和内补丁不同 问题症状:随便写几个标签,不加样式控制的情况下,各自的margin和padding差异较大. 碰到频率:100% 解决方案:初始化CSS的默认样式,*{ ...
- C#获取apk版本信息
获取很多人都会问我为什么要写这个博客,原因很简单,这次研发apk版本信息的时候网上查了很多的资料都没有这方面的信息,因此这次功能完了想写下方法,如果以后博友们遇到了可以直接copy,不用花很多的时间, ...
- jq扩展
方法一(不常用)$.myjq = function(){alert("hello myjQuery);}方法二声明:$.fn.myjq=function(){$(this).text(&qu ...