2013-07-15 37 views
0

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

我实现@JonathanCichon solution这是继承UICollectionView和执行上_visibleBounds自定义操作(我知道这是一个私人API,但不管,我并不需要提交它在苹果商店)

这里我自定义集合视图:

#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但由于屏幕高度<当前可见单元格高度,则不会显示这个...

有人已经面临这个问题?

Thx提前

回答

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 
+0

Thx很多,它的作品就像一个魅力! – Yaman