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实现了这些手势,并且替你处理对于它们的探测和回应. ...
随机推荐
- Oracle 数据库字典 sys.col$ 表中关于type#的解释
sys.col$ 表是oracle基础数据字典表中的列表,表中描述了数据库中各列信息,其中type#是列的数据类型.以下表格说明了各个数值的含义,以供参考. 值 说明 1 如果列 charsetfor ...
- unity3d之切换场景不销毁物体
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...
- vue-构建项目相关事项
安装 :vue-cli npm install -g vue-cli 使用webpack 打包 vue 項目的創建: vue init webpack 項目名子 生產基本的項目結構后 進入到項目目錄 ...
- 学习CSS制作菜单列表,举一反三
1.普通的二三级菜单 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...
- AndroidStudio安装教程
Android studio安装与配置 1.首先下载Android studio安装包,可以从http://www.android-studio.org/ 2.下载好该安装包之后,点击进行安装,依次出 ...
- 精通Groovy
https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html https://juejin.im/entry/ ...
- 论组织资源 #F315
论组织资源 #F315 2016-02-29 yevon_ou 水库论坛 论组织资源 #F315 首先,让我们看一段长微博. 转:五毛大战美分,基层民猪那破事... 就是小区业委会的事,根据业委会相 ...
- git rebase --onto详解
https://blog.pivotal.io/labs/labs/git-rebase-onto http://www.cnblogs.com/rickyk/p/3848768.html
- BEM,SASS,LESS,bootstrap:如何有效地将这些方法,工具和框架聪明地整合?
https://medium.com/@andersonorui_/bem-sass-and-bootstrap-9f89dc07d20f Bootstrap是一个“HTML,CSS和Javascri ...
- SVN常用功能介绍(一)
简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 互联网上很多版本控制服务已从CVS迁移到Subver ...