butry

viewWillLayoutSubviews

现在masonry大行其道,我反倒觉得没有任何必要使用masonry,masonry底层也不过是通过计算frame进行布局,反而影响了app布局的性能,所以我更加建议使用frame进行布局,然而当今app布局千变万化,各种因数据改变而改变布局通过frame好似不能很好的解决这些问题,我的建议是通过在layoutSuvViews这个方法里进行布局以达到动态布局的目的

当给view设置frame的时候,苹果会调用这个view的layoutSubviews这个方法,同时如果你也是在这个view的layoutSubviews方法中设置这个view的子视图的frame的话,那么子视图也会重新布局,以此类推,这能一直让最上面一层的view的布局保持最新的布局,也就是说其实你无需再去修改任何布局,只是需要第一次在layoutSubviews的方法中通过数据的计算来布局后,便可一劳永逸了,无论数据如何变化,你的父视图,子视图,子子视图........都会跟随你的数据进行最快速最节省性能的动态布局,因为设置frame布局是ios的底层布局方式,这个是最节省性能的方式,而且ios本身自带了一个优化措施,就是如果你设置的frame和你第一次或者初始化时设置的fram完全相同的话,那么当你设置frame的时候,这个视图是不会重新再走layoutSubviews这个方法,这也是最大程度的进行了优化,可以想象当你设置了一个view的frame后,他的子视图,子子视图的frame如果改变的话,他们都不会再去走layoutSubviews这个方法能节省多少性能资源,这一点我也是没有想到的

同时,如果修改某个view的子视图的frame,那么这个view也会调用layoutSubviews这个方法,所以建议在layoutSubviews这个方法里面计算好子视图的frame(可以加一个动画效果),无论其他什么地方修改了数据,只需调用layoutSubviews这个方法即可,然后在初始化这个view的时候给他们的子视图一个初始frame这样当layoutSubviews方法走的时候会有一个很漂亮的动画效果,而且同时也可以作为一个占位view使空白页面更加漂亮


(设置frame时若改变了size才会走layoutSubviews这个方法,只修改定位是不会走这个方法的)

uiviewController中的

viewWillLayoutSubviews方法:当self.view中的视图frame的size发生了改变,也会调用这个方法


评论