AutoLayout对 scrollview的contentSize 和contentOffset属性的影响
2016-04-08 12:51
441 查看
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语法规定不能单独对结构体属性的单个成员进行修改,要改必须通过对对象的结构体属性整体赋值,这样做也确保数据的完整性。
相关文章推荐
- 申论心得摘抄
- C++中构造函数初始化成员列表总结
- 蘑菇街笔试题 投篮比赛
- Linux中inode、硬链接与软连接
- ASP.NET MVC下的四种验证编程方式
- CentOS 编译Hadoop 2.6 32位
- hdu3047 Zjnu Stadium--带权并查集
- ActionBar笔记
- 笔记练习:《Javascript入门经典(第5版)》page89_7.9_Practice
- 关于C++中覆盖,重载,隐藏的一点说明
- java中stringBuilder的用法
- 6.1.1Linux下Socket编程
- 《Deep Learning》全书已完稿_附全书电子版
- 关于递归次数的计算
- 【剑指offer系列】 反转链表___16
- Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
- Help to memory sth.
- Android 双击退出APP
- POJ 2230 Watchcow【有向图的欧拉回路+DFS遍历】
- DBeaver数据库管理工具使用体验