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 在 UICollectionViewCompositionalLayout 上自动滚动