最近有一个小伙伴问我关于tableview的展开和折叠问题,相信很多人都写过。 还是自己随便实现了一遍。
基本的思路就是,用一个Model类来计算和控制tableview的高度。
实现效果:cell内容五行或者不足五行的时候,没有折叠功能,内容超过五行的时候,可以折叠和展开。
首先可以根据需求把cell的状态获取到为三个 不可展开、折叠状态和展开状态。 在Model里面可以用枚举来定义
typedef NS_OPTIONS(NSUInteger, TYCellType) { TYCellTypeNone, //不可展开 TYCellTypeFold, //折叠状态 TYCellTypeUnfold, //展开状态 };然后用一个属性来记录状态,并在内容的setter方法里面可以判断出初始的状态未不可展开或者折叠状态。此处我用NSString的分类自己实现了一个计算字符串高度的方法
- (CGFloat)textHeightInWidth:(CGFloat)width font:(UIFont *)font{ NSDictionary *attributesDict = @{NSFontAttributeName:font}; CGSize maxSize = CGSizeMake(width, MAXFLOAT); CGRect subviewRect = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDict context:nil]; return subviewRect.size.height; }此方法传入宽度和字体,用于判断基本label这些控件的显示,若要用到富文本,可以自己相应作出调整。
最主要的就是在Model中写一个计算方法,此方法根据cell的状态和内容计算出cell的高度,并返回给代理。
然后在cell中实现一个BLOCK用于展开或折叠点击之后回调,并且通过状态判断cell的显示情况。
此demo有一些地方的封装还不是很好,左右字体都用的是系统17号,有兴趣的小伙伴可以自己把字体封装进入写接口。
***以上 项目名称T_yunDemoTableUnfold
(欢迎随手给一颗星星哦~)本篇博客Demo地址https://github.com/xmy0010/DemoForCSDN