1、为什么我要自定义结构体
- 我所负责的项目是masonry与xib共存
- 在我自定义view的时候,使用masonry给控件设置约束的时候想一次性设置上、左、右,但又不想先设置底部
- 所以就想着模仿系统CGSize那样子,自定义结构体满足自己的需求
2、先来看看系统CGSize结构体
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CG_BOXABLE CGSize CGSize;
struct 结构体名{
类型名 成员名1;
类型名 成员名2;
... ...
类型名 成员名n;
};
typedef struct CG_BOXABLE 给此结构体定义了一个别名
- typedef 是为了输入时可以直接使用CGSize而不必再输入struct。
- CG_BOXABLE 在CoreGraphics/CGBase.h中可以找到定义的方法,它可以允许将结构体进行快速打包,这样我们就可以使用@()快速地将它转换成NSValue了。
3、接下来我们来看看CGSizeMake
/* Make a size from `(width, height)'. */
CG_INLINE CGSize CGSizeMake(CGFloat width, CGFloat height);
-
CG_INLINE 是系统的一个宏:# define CG_INLINE static inline,那么static inline有什么作用呢?
- static inline一种宏定义语法,区别于define一般用来预编译常量,static inline一般用来预编译函数。
- static表示在当前文件中应用,如 static A, 在其它文件中也可以出现static A.不会导致重名的错误.
- inline内联函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。
4、自定义结构体
设置占位Label的位置结构体,跟系统的基本保持一致
struct
LAPlacehoderTLR {
CGFloat top;
CGFloat left;
CGFloat right;
};
typedef struct CG_BOXABLE LAPlacehoderTLR LAPlacehoderTLR;
CG_INLINE LAPlacehoderTLR
LAPlacehoderTLRMake(CGFloat top, CGFloat left, CGFloat right)
{
LAPlacehoderTLR placehoderTLR;
placehoderTLR.top = top;
placehoderTLR.left = left;
placehoderTLR.right = right;
return placehoderTLR;
};
4、如何使用
定义属性
@property (nonatomic, assign) LAPlacehoderTLR tlr;
使用set方法就可以使用赋值了
- (void)setTlr:(LAPlacehoderTLR)tlr {
_tlr = tlr;
[self.placehoderLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(tlr.top);
make.left.mas_equalTo(tlr.left);
make.right.mas_equalTo(tlr.right);
}];
}
参考资料
1、https://www.jianshu.com/p/80150f88a61b
2、https://www.jianshu.com/p/d557b0831c6a
网友评论