Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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
Iphone 以编程方式滚动带加速和减速的UITableView_Iphone_Ios_Uitableview_Scroll - Fatal编程技术网

Iphone 以编程方式滚动带加速和减速的UITableView

Iphone 以编程方式滚动带加速和减速的UITableView,iphone,ios,uitableview,scroll,Iphone,Ios,Uitableview,Scroll,我试图通过点击按钮以编程方式滚动UITableView。这应该是同样的效果,在做它的手,甚至有点长的滚动时间 首先,我尝试使用scrollToRowAtIndexPath:atScrollPosition:animated:,但是速度太快,时间太长。而且它没有任何加速和减速 您知道如何以编程方式手动滚动UITableView吗?我正在考虑给它发送一些定制的触摸。你认为这行得通吗 非常感谢您的任何想法和帮助!谢谢 UITableview是UIScrollview的一个子类。与UIScrollvie

我试图通过点击按钮以编程方式滚动UITableView。这应该是同样的效果,在做它的手,甚至有点长的滚动时间

首先,我尝试使用scrollToRowAtIndexPath:atScrollPosition:animated:,但是速度太快,时间太长。而且它没有任何加速和减速

您知道如何以编程方式手动滚动UITableView吗?我正在考虑给它发送一些定制的触摸。你认为这行得通吗


非常感谢您的任何想法和帮助!谢谢

UITableview是UIScrollview的一个子类。与UIScrollview类似,您可以通过设置contentOffset属性以编程方式设置UITableview的滚动位置

可以在动画块内更改此特性值,以便在计时中有更多的控制。您需要计算Y点的位置。假设您要滚动到第50行,它可能是50*行高(假设它是统一高度)

例如:

CGFloat calculatedPosY = 50 * rowHeight // do you own calculation of where you'd like it.
[UIView animateWithDuration:0.2
     animations:^{theTableview.contentOffset = CGPointMake(0.0, calculatedPosY);}
     completion:^(BOOL finished){ }];
还有另外一种方法可以提供更多的选择

看看这个方法:

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

好的,这些只是几个“我头脑中最简单的答案”,但是你可以尝试使用这个方法(在
UIScrollView
中,
UITableView
是其中的一个子类):

一旦
-(CGRect)rectForRowAtIndexPath:
提供了单元格的坐标,您就可以设置单元格位置的动画。但与其只调用一次,不如用更小的偏移量调用它几次,然后用越来越大的偏移量,然后再调用更小的偏移量。不过,我担心很难让它看起来平滑


不过,如果这不起作用,可能在
ui视图animateWithDuration:delay:options:animations:completion
块中更改
contentOffset
值也会起作用。也许如果使用UIViewAnimationOptionCurveEaseInOut,只需调用一次就可以得到想要的效果。如果没有,在减速之前,在每一段路上运行几个动画,覆盖更远的距离。

在“单元格”子视图中设置按钮,并使用此代码在按钮的触摸事件中以编程方式滚动表格。若您并没有将按钮设置为表格单元格的子视图,那个么根据需要修改此代码

  CGPoint point = [button.superview convertPoint:button.frame.origin toView:self.tableView];
  CGPoint contentOffset = self.tableView.contentOffset;
  contentOffset.y += (point.y - contentOffset.y - self.navigationController.navigationBar.frame.size.height); // Adjust this value as you need
  [self.tableView setContentOffset:contentOffset animated:YES];

谢谢不过我已经试过了。问题是没有加载表视图的单元格。听起来像是其他问题。也许在动画完成后,您可以使用contentOffset,通过方法“indexPathsForVisibleRows”向tableview询问其可见行。然后使用这些可见的索引路径调用reloadRowsAtIndexPaths:withRowAnimation:。但我认为可能有更高层次的问题在手。谢谢!我试过了。但是,tableView的内容不是以这种方式加载的。我真不敢相信这么难做到。
  CGPoint point = [button.superview convertPoint:button.frame.origin toView:self.tableView];
  CGPoint contentOffset = self.tableView.contentOffset;
  contentOffset.y += (point.y - contentOffset.y - self.navigationController.navigationBar.frame.size.height); // Adjust this value as you need
  [self.tableView setContentOffset:contentOffset animated:YES];