Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UICollectionView的自动滚动-iOS_Ios_Objective C_Uiscrollview_Uicollectionview_Uicollectionviewcell - Fatal编程技术网

UICollectionView的自动滚动-iOS

UICollectionView的自动滚动-iOS,ios,objective-c,uiscrollview,uicollectionview,uicollectionviewcell,Ios,Objective C,Uiscrollview,Uicollectionview,Uicollectionviewcell,我有一个单行的UICollectionView,每个单元格都有不同的宽度(取决于某些标准)。每个单元格都有一个与其关联的float timeInSeconds属性 我想自动水平滚动UICollectionView,这样单元格应该分别通过与该单元格关联的timeinsonds 我尝试使用NSTimer和更改contentOffset来执行此操作,但没有按照我想要的方式工作 代码: //this method is called which fires the `NSTimer` - (void)

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

我想自动水平滚动
UICollectionView
,这样单元格应该分别通过与该单元格关联的
timeinsonds

我尝试使用
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
offset计算,根据一些公式,它应该移动多少步。我的公式失败了:(


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

在物理学中,
空间=速度*时间
,因此
w
应增加
速度*时间
(每0.01秒增量时间)。
如果单元格的可视持续时间保存在
\u messagesArray[lastIndexPath.row][@“duration”]
中,则您应该能够将
速度计算为
空间/时间
所以,增量应该这样定义

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;

在物理学中,
space=velocity*time
,因此
w
应该增加
velocity*time
(每0.01秒增量时间)。
如果单元格的可视持续时间保存在
\u messagesArray[lastIndexPath.row][@“duration”]
中,则您应该能够将
速度计算为
空间/时间
所以,增量应该这样定义

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;


在增加值后,尝试打印
w
值,看看它是否相应增加。@Sebyddd已经这样做了,它确实增加了,但滚动不是根据
单元格的时间进行的。例如,如果所讨论的
单元格有4秒与之关联,那么该单元格应该在4秒后通过屏幕。但是没有发生。滚动速度非常慢。当更改偏移量时,会发生什么情况?滚动位置会改变还是保持在同一位置?它以固定速度滚动。我希望它根据与当前可见的第一个
单元格相关联的时间进行滚动。
。这就是为什么我试图通过除以来计算要移动的偏移量通过
单元格的
浮动时间
宽度..但没有帮助:(考虑到我不知道您正在计算的值。您确定计算是正确的吗?计时器每0.01秒触发一次,这是常数,因此我打赌X偏移量计算不正确。尝试在递增后打印
w
值,看看它是否相应递增。@sebydd已经这样做了,它确实会递增。)se,但滚动不是根据
单元格的时间进行的。例如,如果所讨论的
单元格有4秒关联,则该单元格应在4秒内通过屏幕。但这并没有发生。滚动非常慢。当更改偏移量时,会发生什么情况?滚动位置会改变还是保持在e同一个位置?它以固定的速度滚动。我希望它根据与当前可见的第一个
单元格相关联的时间滚动。这就是为什么我试图通过将
浮动时间
值除以
单元格
宽度来计算要移动的偏移量。但没有帮助:(考虑到我不知道你正在计算的值。你确定计算是正确的吗?计时器每0.01秒启动一次,这是恒定的,所以我打赌X偏移量计算是不正确的。尝试过了。它启动缓慢,但速度逐渐增加。简言之,不起作用。但感谢你的努力。感谢你的努力。谢谢。仍然是数字我们正在研究如何解决这个问题:S@Sha,如果collectionView width是常量(如我所想),则速度将根据“持续时间”而变化单元格的值。每个单元格的速度保持不变吗?还是在同一单元格内变化?实际上,不同单元格的速度确实会变化,比如相应地变慢变快,但工作不准确。在声音结束之前,整个collectionview已滚出屏幕:(所以可能问题是速度应该与单元格宽度相关,而不是与collectionView宽度相关,我将更新我的回答,但仍然无法正确滚动:(试过了。它启动缓慢,但速度逐渐增加。简言之,不起作用。但感谢你的努力。感谢你。仍在想办法解决这个问题:S@Sha,如果collectionView width是常量(如我所想),则速度将根据“持续时间”而变化单元格的值。每个单元格的速度保持不变吗?还是在同一单元格内变化?实际上,不同单元格的速度确实会变化,比如相应地变慢变快,但工作不准确。在声音结束之前,整个collectionview已滚出屏幕:(所以可能问题是速度应该与单元格宽度相关,而不是与collectionView宽度相关,我将更新我的回答,但仍然无法正确滚动:(