Proper relayout if size changes

This commit is contained in:
Michael Schneider
2016-11-14 10:10:47 -08:00
parent 0eb882bae5
commit dcc54c0d36
4 changed files with 25 additions and 2 deletions

View File

@@ -29,6 +29,12 @@ NS_ASSUME_NONNULL_BEGIN
*/ */
- (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged; - (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged;
/// Returns the constrained size for the given node
- (ASSizeRange)constrainedSizeForNode:(ASCellNode *)node;
// TODO: coalesc: Maybe we should push the relayout of nodes to the table / collection node?
//- (void)relayoutNodeIfNeecessary:(ASCellNode *)node;
/* /*
* Methods to be called whenever the selection or highlight state changes * Methods to be called whenever the selection or highlight state changes
* on ASCellNode. UIKit internally stores these values to update reusable cells. * on ASCellNode. UIKit internally stores these values to update reusable cells.

View File

@@ -120,9 +120,8 @@ static NSMutableSet *__cellClassesForVisibilityNotifications = nil; // See +init
- (void)didInvalidateSize - (void)didInvalidateSize
{ {
// TODO: coalesc: Ask the UITableView for the proper constrained size it can layout
CGSize oldSize = self.calculatedSize; CGSize oldSize = self.calculatedSize;
CGSize newSize = [self sizeThatFits:CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX)]; CGSize newSize = [self layoutThatFits:[self constrainedSize]].size;
if (CGSizeEqualToSize(oldSize, newSize) == NO) { if (CGSizeEqualToSize(oldSize, newSize) == NO) {
self.frame = {self.frame.origin, newSize}; self.frame = {self.frame.origin, newSize};
@@ -174,6 +173,14 @@ static NSMutableSet *__cellClassesForVisibilityNotifications = nil; // See +init
} }
} }
- (ASSizeRange)constrainedSize
{
if (_interactionDelegate != nil) {
return [_interactionDelegate constrainedSizeForNode:self];
}
return ASSizeRangeMake(CGSizeZero, CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX));
}
- (void)setSelected:(BOOL)selected - (void)setSelected:(BOOL)selected
{ {
if (_selected != selected) { if (_selected != selected) {

View File

@@ -1579,6 +1579,11 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell";
} }
} }
- (ASSizeRange)constrainedSizeForNode:(ASCellNode *)node
{
return [self.layoutInspector collectionView:self constrainedSizeForNodeAtIndexPath:[self indexPathForNode:node]];
}
- (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged - (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged
{ {
ASDisplayNodeAssertMainThread(); ASDisplayNodeAssertMainThread();

View File

@@ -1568,6 +1568,11 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell";
} }
} }
- (ASSizeRange)constrainedSizeForNode:(ASCellNode *)node
{
return [self dataController:self.dataController constrainedSizeForNodeAtIndexPath:[self indexPathForNode:node]];
}
- (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged - (void)nodeDidRelayout:(ASCellNode *)node sizeChanged:(BOOL)sizeChanged
{ {
ASDisplayNodeAssertMainThread(); ASDisplayNodeAssertMainThread();