大 UICollectionViewCell 在滚动时消失
Posted
技术标签:
【中文标题】大 UICollectionViewCell 在滚动时消失【英文标题】:Large UICollectionViewCell disappear on scrolling 【发布时间】: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
但由于屏幕高度
有人已经遇到过这个问题吗?
提前谢谢
【问题讨论】:
【参考方案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
【讨论】:
以上是关于大 UICollectionViewCell 在滚动时消失的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewCell -- 使 selectedBackgroundView 比单元格本身大
创建 UICollectionViewCell 时子视图框架不正确
scrollToItemAtIndexPath 破坏 UICollectionViewCell 布局
滚动时大型 UICollectionViewCell 停止显示