【问题标题】:Large UICollectionViewCell disappear on scrolling大 UICollectionViewCell 在滚动时消失
【发布时间】:2013-07-15 15:07:55
【问题描述】:

我遇到了与here 相同的问题,即大型 UICollectionViewCell(显然是 UICollectionView 高度的两倍以上)在给定的滚动偏移量处消失,然后在给定的滚动偏移量后又重新出现。

我已经实现了@JonathanCichon solution,它是 UICollectionView 的子类,并在 _visibleBounds 上执行自定义操作(我知道这是一个私有 API,但没关系,我不需要在 Apple Store 上提交)

这是我的自定义收藏视图:

#import "CollectionView.h"

@interface UICollectionView ()

- (CGRect)_visibleBounds;

@end

@implementation CollectionView

- (CGRect)_visibleBounds
{
    CGRect rect = [super _visibleBounds];
    rect.size.height = [self heightOfLargestVisibleCell];
    return rect;
}

- (CGFloat)heightOfLargestVisibleCell
{
    // get current screen height depending on orientation
    CGFloat screenSize = [self currentScreenHeight];

    CGFloat largestCell = 0;

    NSArray *visibleCells = self.visibleCells;

    // get the largest height between visibleCells
    for (UITableViewCell *c in visibleCells)
    {
        CGFloat h = c.frame.size.height;
        largestCell = h > largestCell ? h : largestCell;
    }

    // return higher value between screen height and higher visible cell height
    return MAX(largestCell, screenSize);
}

这有效,滚动时不再消失,但我仍然有一个问题:如果我在滚动位置位于大单元格中间时执行reloadData,它会像之前一样消失...... 我注意到在重新加载数据后,visibleCells 返回nil(在我的heightOfLargestVisibleCell 方法中),所以我的屏幕高度为_visibleBounds 但由于屏幕高度

有人已经遇到过这个问题吗?

提前谢谢

【问题讨论】:

    标签: ios uicollectionview uicollectionviewcell


    【解决方案1】:

    我为您的问题找到了解决方案。我将heightOfLargestVisibleCell计算的值存储起来,重新加载数据后返回最后一个值。

    @interface CollectionView : UICollectionView
    @property (nonatomic, assign) CGFloat lastLargestCellHeight;
    @property (nonatomic, assign) BOOL shouldEvalLargestCellHeight;
    
    @end
    
    @implementation CollectionView
    
    - (CGRect)_visibleBounds
    {
        CGRect rect = [super _visibleBounds];
        rect.size.height = [self heightOfLargestVisibleCell];
        return rect;
    }
    
    
    - (CGFloat)heightOfLargestVisibleCell
    {
        if (self.shouldEvalLargestCellHeight) {
            // get current screen height depending on orientation
            CGFloat screenSize = self.frame.size.height;
    
            CGFloat largestCell = 0;
    
            NSArray *visibleCells = self.visibleCells;
    
            // get the largest height between visibleCells
            for (UITableViewCell *c in visibleCells)
            {
                CGFloat h = c.frame.size.height;
                largestCell = h > largestCell ? h : largestCell;
            }
            //return higher value between screen height and higher visible cell height
            self.lastLargestCellHeight = MAX(largestCell, screenSize);
            self.shouldEvalLargestCellHeight = NO;
        }
        return self.lastLargestCellHeight;
    }
    
    - (void)reloadData
    {
        self.shouldEvalLargestCellHeight = NO;
        [super reloadData];
    }
    
    - (void)setContentOffset:(CGPoint)contentOffset
    {
        self.shouldEvalLargestCellHeight = YES;
        [super setContentOffset:contentOffset];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2020-06-10
      相关资源
      最近更新 更多