多行宏定义注释
// 状态检查
#define MJRefreshCheckState \
MJRefreshState oldState = self.state; \
if (state == oldState) return; \
[super setState:state];
当定义的宏不能一行表达完整时,可以在行的最后加反斜杠,说明下一行继续此宏的定义,最后一行不要加续行符,VC的预处理器在编译之前会自动将\与换行回车去掉(写成多行时,反斜杠后不能有空格,否则编译器(ARM或VC)会报错!)
计算文字的宽度
@interface UILabel(MJRefresh)
- (CGFloat)mj_textWith;
@end
@implementation UILabel(MJRefresh)
- (CGFloat)mj_textWith {
CGFloat stringWidth = 0;
CGSize size = CGSizeMake(MAXFLOAT, MAXFLOAT);
if (self.text.length > 0) {
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
stringWidth =[self.text
boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:self.font}
context:nil].size.width;
#else
stringWidth = [self.text sizeWithFont:self.font
constrainedToSize:size
lineBreakMode:NSLineBreakByCharWrapping].width;
#endif
}
return stringWidth;
}
@end
在MJRefreshComponent这个基类中,添加UILabel的分类,计算出label的宽度,子类生成的label都可以用这个方法得到label的宽度
提取基类,只需要使用最底层的类
这个是MJRefresh的结构设计,我们只需要用到显示层来完成我们需要达到的效果