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

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

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

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

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

 

 

 

iOS开发者交流群:180080550
原文地址:https://www.cnblogs.com/stevenwuzheng/p/5367573.html