@@ -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