前言
在平时UI适配开发中,可能会用到Masonry或者手写布局,在这些布局中,经常会用到一些常量,例如:
1 | - (void)addSubviewsConstraints |
或者:
1 | - (void)layoutSubviews |
上面只是两个固定值的例子,在Masonry中,offset(10)
是一个间距值,对应手写frame布局就是origin.x
和origin.y
,这些值很可能是一些常数,一般不会更改,不过,如果肆意任这些常数散落在代码中,对于后期维护,可能会带来不小的麻烦。
内容
1.一般做法
针对上述的麻烦,一般的做法是,布局时,统一初始化一些常数,后期维护,只是更改这些常数就好了。例如:
1 | //布局常数 |
这样做看似麻烦,但是后期改起来,或者是调试bug时,我们只要关心常量的初始化部分就好了,不用再去看对应的布局代码,这就很省心了。
2.使用结构体统一管理的优化
上面的做法相对已经好了很多,但是,对于复杂的页面,页面的视图元素比较多时,这种方法会显得很臃肿,你要在布局代码前,初始化大量的常量,这种做法很不好,而且,在系统执行布局刷新时,对应的常数,再次被初始化了一遍,即便值没有更改,这就造成了不必要的开销。
对于这个问题,我们这里引入了结构体,结构体在iOS开发中,一般会很少使用,但其实系统中有很多例子,之前提到的CGRect
和CGSize
都是结构体这种数据结构。
下面是利用结构体对之前的做法的一种优化:
1 | /** |
这里使用MyLayoutConsts _layout;
而没有使用属性,是为了节省调用get方法的开销,本质是一样的。
当然,这里要注意,_layout.myViewLeftGap
语句本质上是selg->_layout.myViewLeftGap
,所以要注意在block中的循环引用的问题。
Demo详见StructForLayoutDemo
参考
本文作者:霖溦
本文链接:https://kukumalucn.github.io/blog/2018/08/09/用结构体初始化大量布局常数/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!