zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    深度分页,不存在的
    netty做客户端实战(二)
    netty服务端实战(一)
    netty做上位机主动同时连接多个下位机时,接受报文报 java.lang.IndexOutOfBoundsException: srcIndex: 0异常错误
    使用线程实现多生产者,多消费者demo
    vscode中vue安装,使用的插件
    实用的RBAC模型
    Springboot+thymeleaf+shiro整合
    Log4j作用
    SpringBoot整合thymeleaf
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5367573.html
Copyright © 2011-2022 走看看