UICollectionView 的自动滚动 - iOS

Posted

技术标签:

【中文标题】UICollectionView 的自动滚动 - iOS【英文标题】:Automatic scrolling of UICollectionView - iOS 【发布时间】:2016-07-29 07:00:09 【问题描述】:

我有一个单行的UICollectionView,每个单元格都有一个不同的width,(取决于某些标准)。每个cell 都有一个与之关联的float timeInSeconds 属性。

我想自动水平滚动UICollectionView,这样单元格应该分别传入与该单元格关联的timeInSeconds

我尝试使用 NSTimer 并更改 contentOffset 来执行此操作,但没有按我的意愿工作。

代码:

//this method is called which fires the `NSTimer`
 - (void)configAutoscrollTimer 
    w = self.messagesCollectionView.contentOffset.x;

    autoScrollTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(onTimer) userInfo:nil repeats:YES];


 - (void)onTimer 
    [self autoScrollView];


 - (void)autoScrollView 

  NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:_currentPlayIndex inSection:0];
  UICollectionViewCell *cell = [_messagesCollectionView cellForItemAtIndexPath:lastIndexPath];


  w += ([(NSNumber*)_messagesArray[lastIndexPath.row][@"duration"] floatValue])/cell.bounds.size.width;

  CGPoint offsetPoint = CGPointMake(w, 0);
  self.messagesCollectionView.contentOffset = offsetPoint;

我的水平视图的屏幕截图:

我认为问题在于X 偏移量计算,至于它应该根据某些公式移动多少步。我的公式失败了:(

请指导如何实现根据单元格关联的时间自动滚动。谢谢!

【问题讨论】:

在增加w值后尝试打印它,看看它是否相应增加。 @Sebyddd 已经完成了,它确实增加了,但是滚动不是根据cell 的时间。就像如果有问题的cell 有 4 秒与之关联,那么单元格应该在 4 秒内通过屏幕。但这并没有发生。滚动很慢。 更改偏移量时究竟会发生什么?滚动位置是改变还是停留在同一个地方? 它以固定的速度滚动。我希望它根据与当前可见的第一个 cell 关联的时间滚动。这就是为什么我试图通过除以 @ 来计算要移动的偏移量987654337@ value by cell width .. 但没有帮助:( 考虑到我不知道您正在计算的值。你确定计算正确吗?计时器每 0.01 秒触发一次,这是恒定的,所以我敢打赌 X 偏移量计算不正确。 【参考方案1】:

在物理学中,space = velocity * time,所以w 应该增加velocity * time(每 0.01 秒的增量时间)。 如果单元格的可见持续时间保存在_messagesArray[lastIndexPath.row][@"duration"] 中,您应该可以将velocity 计算为space/time。 所以,增量应该这样定义

float v = self.messagesCollectionView.frame.size.width / ([(NSNumber*)_messagesArray[lastIndexPath.row][@"duration"] floatValue]);
w += v * 0.01f;

(当然v每个单元格只计算一次)

让我知道它是否有效或者我的答案应该被编辑

编辑

基于当前单元格宽度的速度

float v = cell.bounds.size.width / ([(NSNumber*)_messagesArray[lastIndexPath.row][@"duration"] floatValue]);
w += v * 0.01f;

【讨论】:

试过了。它开始缓慢但逐渐增加速度。总之不工作。但是感谢您的努力。欣赏。仍在想办法解决这个问题:S @Sha,如果 collectionView 宽度是恒定的(我认为),速度将根据单元格的“持续时间”值而变化。每个单元的速度是否保持恒定?还是在同一个单元格内发生变化? 实际上不同单元格的速度确实会发生变化,就像它相应地变慢变快一样,但工作不准确,在声音结束之前,整个collectionview已经滚动出屏幕:( 所以也许问题是速度应该与单元格宽度而不是collectionView宽度有关,我会更新我的答案 试过但还是不能正常滚动:(

以上是关于UICollectionView 的自动滚动 - iOS的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 不自动滚动

有没有办法自动滚动到 UICollectionView 的底部

UICollectionView 在 UICollectionViewCompositionalLayout 上自动滚动

有没有办法自动滚动到UICollectionView的底部

如何使用 Timer 在 UITableView 内自动滚动 UICollectionView?

UICollectionView 中的图像在向下滚动时会自动翻转?