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里。

  1. -(void)viewDidAppear:(BOOL)animated
  2. {
  3. [super viewDidAppear:animated];
  4. [_scrollView setContentSize:CGSizeMake(500, 1800)];
  5. }

关于网上很多博客写着“结构体类型里面的某个属性如果想要修改是不允许单个修改的” 之解释:

其实并不是说结构体的成员就一定不能单个修改,例如在某方法中单独定义一个结构体类型的临时变量,是可以对它的成员直接进行修改的。

只是结构体在作为OC对象的属性使用时,OC语法规定不能单独对结构体属性的单个成员进行修改,要改必须通过对对象的结构体属性整体赋值,这样做也确保数据的完整性。

AutoLayout对 scrollview的contentSize 和contentOffset属性的影响的更多相关文章

  1. contentSize、contentInset和contentOffset 是 scrollView三个基本的属性区别和使用

    contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: 其实就是scrollview可以滚动的区域,比如fra ...

  2. iOS开发之 UIScrollView的frame、contentSize、contentOffset和contentInset属性

    ios中下拉图片变大效果 http://blog.csdn.net/mad2man/article/details/14169197 IOS中UIScrollView的frame.contentSiz ...

  3. IOS中UIScrollView的contentSize、contentOffset和contentInset属性

    IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属 性,同时, ...

  4. UIScrollView的contentSize、contentOffset和contentInset属性

    IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属性,同时,U ...

  5. contentInset,contentsize和contentOffset区别

    contentInset,contentsize和contentOffset区别   今天看别人用到了contentInset,觉得很迷糊,于是gogle了一下,搜到了一篇分析的很好的文章,转在这里, ...

  6. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

  7. ContentSize、Contentoffset以及ContentInset属性

    ContentSize UIScrollView可以滚动的区域.在我的理解中,我把UIScrollView看成是具有上下两层的一个复合视图,frame控制着上层的大小,我们看到的UIScrollVie ...

  8. ScrollView不设置contentSize属性依然也可以作为底层滚动View(使用masonry设置scrollView的contentSize)

    第一步 //下层的scroolView self.baseScrollView = [[UIScrollView alloc] init]; self.baseScrollView.delegate ...

  9. UIScrollView的contentSize与contentOffset

    UIScrollView为了显示多于一个屏幕的内容或者超过你能放在内存中的内容. Scroll View为你处理缩小放大手势,UIScrollView实现了这些手势,并且替你处理对于它们的探测和回应. ...

随机推荐

  1. No.3一步步学习vuejs之计算属性和观察者

    一.计算属性运行结果 <div id = "demo1"> <p>Original message: "{{message}}"< ...

  2. node.js学习网址

    七天学会NodeJS: http://www.open-open.com/lib/view/1392611872538 https://nodejs.org/api/ Node.js v0.10.18 ...

  3. Python基础-map/reduce/filter

    一.map Python内置函数,用法及说明如下: class map(object): """ map(func, *iterables) --> map obj ...

  4. win7 64 位安装 python,提示: 0x80240017-未指定的错误

    首先确保从python官网下载正确的python版本: https://www.python.org/downloads/windows/ 然后,应该是 VC 相关的问题. 去微软网站下载下列补丁包即 ...

  5. c/c++ 按照行读取文件

    本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题. 但是请一定注意linux和Windows文件格式的区别,比如: 1. 当linux上的代码读取Windows文 ...

  6. idea打jar包

    昨天碰到个问题:使用idea打成jar包,但是在测试环境一直报错.参考: http://blog.csdn.net/aotian16/article/details/52198378 之后发现原来的j ...

  7. undo表空间不足,ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS2'

    故障现象:UNDO表空间越来越大,长此下去最终数据因为磁盘空间不足而崩溃: 问题分析:本问题在ORACLE系统管理中属于比较正常的一现象,产生问题的原因主要以下两点: 1. 有较大的事务量让Oracl ...

  8. Linux->ZooKeeper集群搭建

    人,总免不了有心结,限制着自己,难以前行.对于ZooKeeper的理解,以及实践也拖了很久,今天用零散时间学习一下,补点干货. 一.简述 Zookeeper是Google的Chubby一个开源的实现, ...

  9. 五、mariadb遇到的坑——Linux学习笔记

    C#连接MySQL异常:The host localhost does not support SSL connections. 解决方案: 连接字符串添加如下语句. SslMode = none; ...

  10. MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...