美文网首页iOS高质量博客iOS 开发Ios@IONIC
iOS更改xib或者storyboard中控件Frame的注意点

iOS更改xib或者storyboard中控件Frame的注意点

作者: 未来行者 | 来源:发表于2016-08-21 20:51 被阅读3821次

    有时候我们会遇到这样的问题:假如在(xib或者sb就统称nib)nib中有一个view(默认大小是100*100),我在控制器中的viewDidLoad方法中更改了frame却发现打印出的值确实是改了,但是实际上显示的结果却没有变化?如下所示:

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSLog(@"before----%@",NSStringFromCGRect(self.myView.frame));
        CGRect tempFrame = self.myView.frame;
        tempFrame.size.width += 100;
        self.myView.frame = tempFrame;
        NSLog(@"after----%@",NSStringFromCGRect(self.myView.frame));
    }
    

    打印结果,宽度确实是变了:



    模拟器上显示的结果没有变化,依然是100*100:


    为什么会出现这种情况呢?
    罪魁祸首就在在于这里:


    如果我们是从nib中通过拖线连接的属性,那么在viewDidLoad之后会根据初始的frame再计算一次frame,过程中,你虽然更改了frame,但是auto layout之后又恢复了之前的frame,所以模拟器显示没有变化.
    但为什么打印值变了呢?很简单,因为auto layout是在viewDidLoad方法之后计算的,所以在viewDidLoad方法中打印出的值肯定改变了,可后面又被改变回原来的值.

    这里有一个注意点:在viewDidLoad方法中打印的frame可能不准确.

    那怎么才能真正的去更改frame呢?
    有两种方式:

    1. 在viewDidLayoutSubviews方法中改变frame,这个方法通常是view显示之前最后执行的,所以这里更改没问题
    - (void)viewDidLayoutSubviews{
        [super viewDidLayoutSubviews];
        CGRect tempFrame = self.myView.frame;
        tempFrame.size.width += 100;
        self.myView.frame = tempFrame;
        NSLog(@"2----%@",NSStringFromCGRect(self.myView.frame));
    }
    

    打印结果:


    模拟器显示:

    2.第二种方式更简单,去掉auto layout,就可以在viewDidLoad方法中更改了



    结果一样,就不再赘述了.

    谢谢!如有不正确的地方,欢迎指正.

    相关文章

      网友评论

      • iOS阿能:1.SB加载界面的viewDidload结束后,会优先返回SB当前设置的约束
        2.在viewwillapear的时候,针对屏幕大小约束,进行frame修改.

        另: SB开发决定是好东西,只是错误的见解跟留下辣鸡的代码,让大多数人抗拒而已.
        未来行者:@iOS阿能 是的,SB已经不断优化了,不过到底采用哪种方式仁者见仁吧
      • Amuxiaomu:遇到了这种情况😂,但是不知道为什么之前一直没有问题的,我吧这个钩子去掉又加上也就没有出现这种问题了
        最后还是个农:受教了,困扰了好久
        Amuxiaomu:@未来行者 本来是打算用纯代码,但是我接手的项目是另一个同事写的,只能接着写了....
        未来行者:@Amuxiaomu xib或者SB经常莫名其妙的出现问题的,所以我现在都是纯代码开发,建议你也用纯代码
      • 阿不不不不:好文,受教了大神
        未来行者:@hmpff 谢谢,有什么问题可以一起交流,后面还会有由浅到深的更多文章

      本文标题:iOS更改xib或者storyboard中控件Frame的注意点

      本文链接:https://www.haomeiwen.com/subject/cmdwsttx.html