From 0df882f28cc3903cc49f00aab0b2e93f0ba923b3 Mon Sep 17 00:00:00 2001 From: "pengfei.zhou" Date: Thu, 8 Sep 2022 18:34:27 +0800 Subject: [PATCH] iOS: Fix layout in flowlayout or list --- .../Pod/Classes/Shader/DoricFlowLayoutNode.m | 47 +++++++++---------- .../Classes/Shader/DoricHorizontalListNode.m | 5 +- doric-iOS/Pod/Classes/Shader/DoricListNode.m | 7 +-- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/doric-iOS/Pod/Classes/Shader/DoricFlowLayoutNode.m b/doric-iOS/Pod/Classes/Shader/DoricFlowLayoutNode.m index 8aa60813..910a5b0f 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricFlowLayoutNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricFlowLayoutNode.m @@ -45,8 +45,8 @@ @interface DoricFlowLayout : UICollectionViewLayout @property(nonatomic, readonly) CGFloat rowSpace; @property(nonatomic, strong) NSMutableDictionary *columnHeightInfo; @property(nonatomic, weak) id delegate; -@property(nonatomic, copy) NSArray *layoutAttributes; -@property(nonatomic, copy) NSArray *unionRects; +@property(nonatomic, copy) NSArray *layoutAttributes; +@property(nonatomic, copy) NSArray *unionRects; @property(nonatomic, strong) NSArray *swapDisabled; @end @@ -81,25 +81,25 @@ - (void)prepareLayout { } NSMutableArray *array = [NSMutableArray array]; NSInteger count = [self.collectionView numberOfItemsInSection:0]; - + NSNumber *minYOfColumn = @(0); NSArray *keys = self.columnHeightInfo.allKeys; NSArray *sortedKeys = [keys sortedArrayUsingComparator:^NSComparisonResult(NSNumber *obj1, NSNumber *obj2) { return ([obj1 intValue] <= [obj2 intValue] ? NSOrderedAscending : NSOrderedDescending); }]; - + for (int i = 0; i < count; i++) { minYOfColumn = @(0); - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0] ; - + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; - + for (NSNumber *key in sortedKeys) { if ([self.columnHeightInfo[key] floatValue] < [self.columnHeightInfo[minYOfColumn] floatValue]) { minYOfColumn = key; } } - + CGFloat width = [self.delegate doricFlowLayoutItemWidthAtIndexPath:indexPath]; CGFloat height = [self.delegate doricFlowLayoutItemHeightAtIndexPath:indexPath]; CGFloat x = 0; @@ -126,15 +126,15 @@ - (void)prepareLayout { self.columnHeightInfo[minYOfColumn] = @(y + height); } attrs.frame = CGRectMake(x, y, width, height); - + [array addObject:attrs]; } self.layoutAttributes = array; - + NSMutableArray *mutableCopy = [NSMutableArray array]; long idx = 0; NSInteger itemCounts = count; - while(idx < itemCounts){ + while (idx < itemCounts) { CGRect rect1 = self.layoutAttributes[idx].frame; idx = MIN(idx + count, itemCounts) - 1; CGRect rect2 = self.layoutAttributes[idx].frame; @@ -147,29 +147,29 @@ - (void)prepareLayout { - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSInteger begin = 0; NSInteger end = self.unionRects.count; - NSMutableArray *attrs = [NSMutableArray array]; - + NSMutableArray *attrs = [NSMutableArray array]; + for (int i = 0; i < end; i++) { if (CGRectIntersectsRect(rect, [self.unionRects[i] CGRectValue])) { begin = i * self.layoutAttributes.count; break; } } - + for (long i = self.unionRects.count - 1; i >= 0; i--) { if (CGRectIntersectsRect(rect, [self.unionRects[i] CGRectValue])) { end = MIN((i + 1) * self.layoutAttributes.count, self.layoutAttributes.count); break; } } - + for (NSInteger i = begin; i < end; i++) { UICollectionViewLayoutAttributes *attr = self.layoutAttributes[i]; if (CGRectIntersectsRect(rect, attr.frame)) { [attrs addObject:attr]; } } - + return attrs; } @@ -255,7 +255,7 @@ - (UICollectionView *)build { if (@available(iOS 11, *)) { it.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } - + self.longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)]; [it addGestureRecognizer:self.longPress]; [self.longPress setEnabled:NO]; @@ -268,9 +268,9 @@ - (void)longPressAction:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { if (indexPath != nil) { [self.view beginInteractiveMovementForItemAtIndexPath:indexPath]; - + self.currentDragIndexPath = indexPath; - + if (self.beforeDraggingFuncId != nil) { DoricAsyncResult *asyncResult = [self callJSResponse:self.beforeDraggingFuncId, @(indexPath.row), nil]; JSValue *model = [asyncResult waitUntilResult]; @@ -486,12 +486,9 @@ - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collection if (props[@"fullSpan"]) { fullSpan = [props[@"fullSpan"] boolValue]; } - if (fullSpan) { - node.view.width = collectionView.width; - } else { - node.view.width = (collectionView.width - (self.columnCount - 1) * self.columnSpace) / self.columnCount; - } - [node.view.doricLayout apply]; + CGFloat width = fullSpan ? collectionView.width : (collectionView.width - (self.columnCount - 1) * self.columnSpace) / self.columnCount; + CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.height; + [node.view.doricLayout apply:CGSizeMake(width, height)]; [node requestLayout]; [self callItem:position size:node.view.frame.size]; return cell; diff --git a/doric-iOS/Pod/Classes/Shader/DoricHorizontalListNode.m b/doric-iOS/Pod/Classes/Shader/DoricHorizontalListNode.m index 2ea74c34..d7077a96 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricHorizontalListNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricHorizontalListNode.m @@ -126,7 +126,7 @@ - (void)longPressAction:(UILongPressGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { if (indexPath != nil) { [self.view beginInteractiveMovementForItemAtIndexPath:indexPath]; - + self.currentDragIndexPath = indexPath; if (self.beforeDraggingFuncId != nil) { DoricAsyncResult *asyncResult = [self callJSResponse:self.beforeDraggingFuncId, @(indexPath.row), nil]; @@ -266,7 +266,8 @@ - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collection DoricHorizontalListItemNode *node = cell.doricHorizontalListItemNode; node.viewId = model[@"id"]; [node blend:props]; - [node.view.doricLayout apply:CGSizeMake(collectionView.width, collectionView.height)]; + CGFloat width = node.view.doricLayout.widthSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.width; + [node.view.doricLayout apply:CGSizeMake(width, collectionView.height)]; [node requestLayout]; [self callItem:position width:node.view.width]; return cell; diff --git a/doric-iOS/Pod/Classes/Shader/DoricListNode.m b/doric-iOS/Pod/Classes/Shader/DoricListNode.m index 347ad639..e50213da 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricListNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricListNode.m @@ -40,7 +40,7 @@ @interface DoricTableView : UITableView @implementation DoricTableView - (CGSize)sizeThatFits:(CGSize)size { CGSize result = [super sizeThatFits:size]; - if(self.doricLayout.widthSpec == DoricLayoutFit && self.contentSize.width>0){ + if (self.doricLayout.widthSpec == DoricLayoutFit && self.contentSize.width > 0) { return CGSizeMake(self.contentSize.width, result.height); } return result; @@ -135,7 +135,7 @@ - (void)longPressAction:(UILongPressGestureRecognizer *)sender { return; } } - + NSString *fromValue = self.itemViewIds[@(self.currentDragIndexPath.row)]; NSString *toValue = self.itemViewIds[@(indexPath.row)]; self.itemViewIds[@(self.currentDragIndexPath.row)] = toValue; @@ -268,7 +268,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N DoricListItemNode *node = cell.doricListItemNode; node.viewId = model[@"id"]; [node blend:props]; - [node.view.doricLayout apply:CGSizeMake(tableView.width, tableView.height)]; + CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : tableView.height; + [node.view.doricLayout apply:CGSizeMake(tableView.width, height)]; [node requestLayout]; [self callItem:position height:node.view.height]; return cell;