AutoLayout对 scrollview的contentSize 和contentOffset属性的影响

 

AutoLayout对 scrollview的contentSize 和contentOffset属性的影响

 

问题1、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);spa

2.若是要使用AutoLayout,要么本身设置完subview的constraint,而后让系统自动根据constraint计算出contentSize。对象

 如 self.scrollView.contentSize = self.imgView.frame.size;教程

3.要么就在viewDidAppear里面本身手动设置contentsize。ci

另外,设置scrollView的初始偏移量contentOffset也会受到AutoLayout影响,在viewDidLoad中设置的偏移量,因受AutoLayout影响,在viewDidAppear方法中会被归(0,0),此问题见如下代码,可参考以上3种方法进行解决。开发

- (void)viewDidLoad {博客

    [super viewDidLoad];it

  NSLog(@"viewDidLoad");class

    //设置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}

 

 

问题2、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语法规定不能单独对结构体属性的单个成员进行修改,要改必须经过对对象的结构体属性总体赋值,这样作也确保数据的完整性。

相关文章
相关标签/搜索