Skip to content

Commit 9b18d46

Browse files
author
sunnyxx
committed
fix iOS 10.3 bug
1 parent e3ee86c commit 9b18d46

1 file changed

Lines changed: 28 additions & 1 deletion

File tree

Classes/UITableView+FDTemplateLayoutCell.m

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,38 @@ - (CGFloat)fd_systemFittingHeightForConfiguratedCell:(UITableViewCell *)cell {
5757
// Add a hard width constraint to make dynamic content views (like labels) expand vertically instead
5858
// of growing horizontally, in a flow-layout manner.
5959
NSLayoutConstraint *widthFenceConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:contentViewWidth];
60-
[cell.contentView addConstraint:widthFenceConstraint];
60+
61+
// [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.
62+
static BOOL isSystemVersionEqualOrGreaterThen10_3 = NO;
63+
static dispatch_once_t onceToken;
64+
dispatch_once(&onceToken, ^{
65+
isSystemVersionEqualOrGreaterThen10_3 = UIDevice.currentDevice.systemVersion.floatValue >= 10.3;
66+
});
67+
68+
NSArray<NSLayoutConstraint *> *edgeConstraints;
69+
if (isSystemVersionEqualOrGreaterThen10_3) {
70+
// To avoid confilicts, make width constraint softer than required (1000)
71+
widthFenceConstraint.priority = UILayoutPriorityRequired - 1;
72+
73+
// Build edge constraints
74+
NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];
75+
NSLayoutConstraint *rightConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeRight multiplier:1.0 constant:0];
76+
NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];
77+
NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:cell.contentView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:cell attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0];
78+
edgeConstraints = @[leftConstraint, rightConstraint, topConstraint, bottomConstraint];
79+
[cell addConstraints:edgeConstraints];
80+
}
6181

82+
[cell.contentView addConstraint:widthFenceConstraint];
83+
6284
// Auto layout engine does its math
6385
fittingHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
86+
87+
// Clean-ups
6488
[cell.contentView removeConstraint:widthFenceConstraint];
89+
if (isSystemVersionEqualOrGreaterThen10_3) {
90+
[cell removeConstraints:edgeConstraints];
91+
}
6592

6693
[self fd_debugLog:[NSString stringWithFormat:@"calculate using system fitting size (AutoLayout) - %@", @(fittingHeight)]];
6794
}

0 commit comments

Comments
 (0)