From 734fd3ad777069a672d00df6b0bc40b13978a8c4 Mon Sep 17 00:00:00 2001 From: tpx Date: Thu, 4 Oct 2018 18:26:33 +0800 Subject: [PATCH] Optimized height calculation --- Classes/UITableView+FDTemplateLayoutCell.m | 39 ++-------------------- 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/Classes/UITableView+FDTemplateLayoutCell.m b/Classes/UITableView+FDTemplateLayoutCell.m index 632b32c..9af9b93 100644 --- a/Classes/UITableView+FDTemplateLayoutCell.m +++ b/Classes/UITableView+FDTemplateLayoutCell.m @@ -73,41 +73,9 @@ - (CGFloat)fd_systemFittingHeightForConfiguratedCell:(UITableViewCell *)cell { CGFloat fittingHeight = 0; if (!cell.fd_enforceFrameLayout && contentViewWidth > 0) { - // Add a hard width constraint to make dynamic content views (like labels) expand vertically instead - // of growing horizontally, in a flow-layout manner. - NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:contentViewWidth]; - - // [bug fix] after iOS 10.3, Auto Layout engine will add an additional 0 width constraint onto cell's content view, to avoid that, we add constraints to content view's left, right, top and bottom. - static BOOL isSystemVersionEqualOrGreaterThen10_2 = NO; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - isSystemVersionEqualOrGreaterThen10_2 = [UIDevice.currentDevice.systemVersion compare:@"10.2" options:NSNumericSearch] != NSOrderedAscending; - }); - - NSArray *edgeConstraints; - if (isSystemVersionEqualOrGreaterThen10_2) { - // To avoid confilicts, make width constraint softer than required (1000) - widthFenceConstraint.priority = UILayoutPriorityRequired - 1; - - // Build edge constraints - NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0]; - NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeRight multiplier:1.0 constant:-rightSystemViewsWidth]; - NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeTop multiplier:1.0 constant:0]; - NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0]; - edgeConstraints = @[leftConstraint, rightConstraint, topConstraint, bottomConstraint]; - [cell addConstraints:edgeConstraints]; - } - - [cell.contentView addConstraint:widthFenceConstraint]; // Auto layout engine does its math - fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; - - // Clean-ups - [cell.contentView removeConstraint:widthFenceConstraint]; - if (isSystemVersionEqualOrGreaterThen10_2) { - [cell removeConstraints:edgeConstraints]; - } + fittingHeight = [cell.contentView systemLayoutSizeFittingSize:CGSizeMake(contentViewWidth, UILayoutFittingCompressedSize.height)].height; [self fd_debugLog:[NSString stringWithFormat:@"calculate using system fitting size (AutoLayout) - %@", @(fittingHeight)]]; } @@ -250,10 +218,7 @@ - (__kindof UITableViewHeaderFooterView *)fd_templateHeaderFooterViewForReuseIde - (CGFloat)fd_heightForHeaderFooterViewWithIdentifier:(NSString *)identifier configuration:(void (^)(id))configuration { UITableViewHeaderFooterView *templateHeaderFooterView = [self fd_templateHeaderFooterViewForReuseIdentifier:identifier]; - NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:templateHeaderFooterView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:CGRectGetWidth(self.frame)]; - [templateHeaderFooterView addConstraint:widthFenceConstraint]; - CGFloat fittingHeight = [templateHeaderFooterView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; - [templateHeaderFooterView removeConstraint:widthFenceConstraint]; + CGFloat fittingHeight = [templateHeaderFooterView systemLayoutSizeFittingSize:CGSizeMake(CGRectGetWidth(self.frame), UILayoutFittingCompressedSize.height)].height; if (fittingHeight == 0) { fittingHeight = [templateHeaderFooterView sizeThatFits:CGSizeMake(CGRectGetWidth(self.frame), 0)].height;