当前位置: 首页 > 知识库问答 >
问题:

UICollectionViewFlowLayout的estimatedItemSize中断滚动?

容磊
2023-03-14

(编辑:从iOS 9开始似乎工作得很好。我没有做过大量的测试,但这个示例可以工作。这证实了iOS 8中存在的错误。)

我花了很多时间测试UICollectionView的Flow Layout自调整大小行为。在经历了很多挫折之后,问题被缩小到这样一个事实:一旦将estimatedItemSize设置为非零大小,滚动就不能正常工作。

在我的示例中,它不显示 40 个项目,而是只显示 32 个项目。

我已经复制粘贴了下面的代码。我已经从Swift版本开始测试了很多东西。

基本上,它无法计算和/或正确更新布局的集合视图内容大小()

这是一个完整的演示http://git.io/AIrHNA

有人能给我指出正确的方向吗?

谢谢你

@implementation ViewControllerObjcC

static NSString * const reuseIdentifier = @"Cell";
-(UICollectionViewFlowLayout*)flowLayout{
  return (UICollectionViewFlowLayout*)self.collectionViewLayout;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
  CGSize estimatedSize = CGSizeMake(self.view.frame.size.width, 25.0);
  BOOL testEstimatedItemSize = true;
  if (testEstimatedItemSize) {
    [self flowLayout].estimatedItemSize = estimatedSize;
  }else{
    [self flowLayout].itemSize = estimatedSize;
  }

}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 40;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
  UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
  UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
  [cell.contentView addSubview:label];
  label.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
  label.backgroundColor = [UIColor redColor];
  return cell;
}

共有3个答案

程城
2023-03-14

我有同样的问题。就我而言,项目之间的间距为 32。我的代码是这样的:

collectionViewLayout.minimumInteritemSpacing = 0
collectionViewLayout.minimumLineSpacing = 32
collectionViewLayout.scrollDirection = .horizontal
collectionViewLayout.itemSize = UICollectionViewFlowLayout.automaticSize
collectionViewLayout.estimatedItemSize = CGSize(width: 100, height: 32)

我将< code > minimumInteritemSpacing 改为32,与< code>minimumLineSpacing相同,以解决这个问题。

collectionViewLayout.minimumInteritemSpacing = 32
狄兴邦
2023-03-14

根据文档:

此属性的默认值为CGSizeZero。将其设置为任何其他值会导致集合视图使用单元格的preferredLayoutAttributesFittingAttributes:方法查询每个单元格的实际大小。如果所有单元格的高度都相同,请使用itemSize属性而不是此属性来指定单元格大小。

你的项目中似乎没有使用这个preferredLayoutAtoritesFitting Atorites:方法?,你试过实现吗?

另一方面,此解决方案看起来不错:使用自动布局在 UICollectionView 中指定单元格的一个维度

杜浩壤
2023-03-14

从苹果的文件中,

具体来说,不在屏幕上的单元格被假定为估计的高度。

这是我的猜测。

当估计高度小于实际单元格高度时,集合视图的内容大小预测小于实际内容大小。

因此,它只显示总共40个单元中的32个。

在我的项目中,当使用大的估计尺寸时,所有的celsl都被显示。

 类似资料:
  • 问题内容: 我有一个需要测试的响应式网站。如果网站转到平板电脑的窗口大小,我希望测试检查是否有水平滚动条。根据设计,它们永远不会出现在平板电脑上。 是否有人使用Selenium Webdriver Java Cucumber拥有一段伪代码来断言水平滚动条的存在? 问题答案: 您可以使用以下方法进行测试: 垂直滚动条: 水平滚动条:

  • 本文向大家介绍JS实现判断滚动条滚到页面底部并执行事件的方法,包括了JS实现判断滚动条滚到页面底部并执行事件的方法的使用技巧和注意事项,需要的朋友参考一下 需要了解三个dom元素,分别是:clientHeight、offsetHeight、scrollTop。 clientHeight:这个元素的高度,占用整个空间的高度,所以,如果一个div有滚动条,那个这个高度则是不包括滚动条没显示出来的下面部

  • 本文向大家介绍jQuery判断是否存在滚动条的简单方法,包括了jQuery判断是否存在滚动条的简单方法的使用技巧和注意事项,需要的朋友参考一下 利用jQuery控制滚动条滚动,再判断滚动条是否有偏移。如果有,则存在滚动条,相反没有滚动就不存在。 以上这篇jQuery判断是否存在滚动条的简单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍JS判断页面是否出现滚动条的方法,包括了JS判断页面是否出现滚动条的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS判断页面是否出现滚动条的方法。分享给大家供大家参考。具体如下:  希望本文所述对大家的javascript程序设计有所帮助。

  • 这个下拉列表有点麻烦。http://jsfidle.net/vnr0rbuu/2/ 如果你使用你的轨迹板或苹果鼠标,你有隐形滚动条默认,它为它工作!但是,如果你使用另一个鼠标或者一台PC,你的每个滚动条都是可见的,这里我的li没有正确地应用我的内联块的样式。 知道吗? 我得HTML: 和我的CSS:

  • 我目前有一个容器有一个最大高度800px。它还具有overflow-y:scroll。我想要完成的事情很简单(可能不是那么简单,所以我才问你们!)。 我想继续拥有这个溢出-Y卷轴。然而,我有内容被切断。我有一个具有类future-dropdown的div,我想让里面的内容有目的地覆盖这个容器。如果您看一下代码片段,我在div中的内容会因为溢出-y滚动而被截断。 我怎么能绕过这个还留着这个?我仍然需