【问题标题】:Automatic scrolling of UICollectionView - iOSUICollectionView 的自动滚动 - 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 偏移量计算不正确。

标签: ios objective-c uiscrollview uicollectionview uicollectionviewcell


【解决方案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宽度有关,我会更新我的答案
  • 试过但还是不能正常滚动:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
相关资源
最近更新 更多