123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- //
- // UITableView+SDAutoTableViewCellHeight.h
- // SDAutoLayout 测试 Demo
- //
- // Created by aier on 15/11/1.
- // Copyright © 2015年 gsd. All rights reserved.
- //
- /*
-
- *********************************************************************************
- * *
- * 在您使用此自动布局库的过程中如果出现bug请及时以以下任意一种方式联系我们,我们会及时修复bug并 *
- * 帮您解决问题。 *
- * QQ : 2689718696(gsdios) *
- * Email : gsdios@126.com *
- * GitHub: https://github.com/gsdios *
- * 新浪微博:GSD_iOS *
- * *
- *********************************************************************************
-
- */
- /*
- PS:cell高度自适应前提>>应该调用cell的“- (void)setupAutoHeightWithBottomView:(UIView *)bottomView bottomMargin:(CGFloat)bottomMargin”方法进行cell的自动高度设置
- */
- #import <UIKit/UIKit.h>
- #import "UIView+SDAutoLayout.h"
- @class SDCellAutoHeightManager;
- typedef void (^AutoCellHeightDataSettingBlock)(UITableViewCell *cell);
- #define kSDModelCellTag 199206
- #pragma mark - UITableView 方法,返回自动计算出的cell高度
- @interface UITableView (SDAutoTableViewCellHeight)
- @property (nonatomic, strong) SDCellAutoHeightManager *cellAutoHeightManager;
- /**
- * 返回计算出的cell高度(普通简化版方法,同样只需一步设置即可完成)(用法:单cell详见demo5,多cell详见demo7)
- * model : cell的数据模型实例
- * keyPath : cell的数据模型属性的属性名字符串(即kvc原理中的key)
- * cellClass : 当前的indexPath对应的cell的class
- * contentViewWidth : cell的contentView的宽度
- */
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath model:(id)model keyPath:(NSString *)keyPath cellClass:(Class)cellClass contentViewWidth:(CGFloat)contentViewWidth;
- /**
- * 返回计算出的cell高度(普通简化版方法,同样只需一步设置即可完成)(用法:见DemoVC14)
- * cellClass : 当前的indexPath对应的cell的class
- * contentViewWidth : cell的contentView的宽度
- * cellDataSetting : 设置cell数据的block
- */
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath cellClass:(Class)cellClass cellContentViewWidth:(CGFloat)width cellDataSetting:(AutoCellHeightDataSettingBlock)cellDataSetting;
- /** 刷新tableView但不清空之前已经计算好的高度缓存,用于直接将新数据拼接在旧数据之后的tableView刷新 */
- - (void)reloadDataWithExistedHeightCache;
- /** 刷新tableView同时调整已经计算好的高度缓存,用于直接将新数据插在旧数据前面的tableView的刷新 */
- - (void)reloadDataWithInsertingDataAtTheBeginingOfSection:(NSInteger)section newDataCount:(NSInteger)count;
- /**
- * 刷新tableView同时调整已经计算好的高度缓存,用于直接将新数据插在旧数据前面的tableView的刷新(用于刷新多个section)
- * sectionNumsArray : 要刷新的所有section序号组成的数组, 例@[@(0), @(1)]
- * dataCountsArray : 每个section的数据条数组成的数组, 例@[@(20), @(10)]
- */
- - (void)reloadDataWithInsertingDataAtTheBeginingOfSections:(NSArray *)sectionNumsArray newDataCounts:(NSArray *)dataCountsArray;
- /** 返回所有cell的高度总和 */
- - (CGFloat)cellsTotalHeight;
- @property (nonatomic, copy) AutoCellHeightDataSettingBlock cellDataSetting;
- @end
- #pragma mark - UITableViewController 方法,返回自动计算出的cell高度
- @interface UITableViewController (SDTableViewControllerAutoCellHeight)
- /** (UITableViewController方法)升级版!一行代码(一步设置)搞定tableview的cell高度自适应,同时适用于单cell和多cell,性能比普通版稍微差一些,不建议在数据量大的tableview中使用 */
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath cellContentViewWidth:(CGFloat)width;
- @end
- #pragma mark - NSObject 方法,返回自动计算出的cell高度
- @interface NSObject (SDAnyObjectAutoCellHeight)
- /** (NSObject方法)升级版!一行代码(一步设置)搞定tableview的cell高度自适应,同时适用于单cell和多cell,性能比普通版稍微差一些,不建议在数据量大的tableview中使用 */
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath cellContentViewWidth:(CGFloat)width tableView:(UITableView *)tableView;
- @end
- // ------------------------------- 以下为库内部使用无须了解 --------------------
- @interface SDCellAutoHeightManager : NSObject
- @property (nonatomic, assign) BOOL shouldKeepHeightCacheWhenReloadingData;
- @property (nonatomic, assign) CGFloat contentViewWidth;
- @property (nonatomic, assign) Class cellClass;
- @property (nonatomic, assign) CGFloat cellHeight;
- @property (nonatomic, strong) UITableViewCell *modelCell;
- @property (nonatomic, strong) NSMutableDictionary *subviewFrameCacheDict;
- @property (nonatomic, strong, readonly) NSDictionary *heightCacheDict;
- @property (nonatomic, copy) AutoCellHeightDataSettingBlock cellDataSetting;
- - (void)clearHeightCache;
- - (void)clearHeightCacheOfIndexPaths:(NSArray *)indexPaths;
- - (void)deleteThenResetHeightCache:(NSIndexPath *)indexPathToDelete;
- - (void)insertNewDataAtTheBeginingOfSection:(NSInteger)section newDataCount:(NSInteger)count;
- - (void)insertNewDataAtIndexPaths:(NSArray *)indexPaths;
- - (NSNumber *)heightCacheForIndexPath:(NSIndexPath *)indexPath;
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath model:(id)model keyPath:(NSString *)keyPath;
- - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath model:(id)model keyPath:(NSString *)keyPath cellClass:(Class)cellClass;
- - (NSMutableArray *)subviewFrameCachesWithIndexPath:(NSIndexPath *)indexPath;;
- - (void)setSubviewFrameCache:(CGRect)rect WithIndexPath:(NSIndexPath *)indexPath;
- - (instancetype)initWithCellClass:(Class)cellClass tableView:(UITableView *)tableView;
- + (instancetype)managerWithCellClass:(Class)cellClass tableView:(UITableView *)tableView;
- @end
|