以编程方式滚动具有加速和减速的UITableView

时间:2011-10-12 06:42:36

标签: iphone ios uitableview scroll

我正在尝试通过点击按钮以编程方式滚动UITableView。在手动操作时应该是相同的效果,或者在滚动时间内更长一点。

首先我尝试使用 scrollToRowAtIndexPath:atScrollPosition:animated:但是它太快并且及时修复。它也没有任何加速和减速。

任何想法如何以编程方式滚动UITableView,因为它已经手动滚动?我正在考虑向它发送一些自定义触摸。你认为它可行吗?

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

3 个答案:

答案 0 :(得分:9)

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

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

例如:

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

答案 1 :(得分:6)

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

  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];

答案 2 :(得分:2)

嗯,这些只是“我头脑中的答案”,但您可以尝试使用此方法(在UIScrollView中,其中UITableView是子类):

-(void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

一旦-(CGRect) rectForRowAtIndexPath:为您提供了单元格的坐标,您就可以设置动画到单元格的位置。但是不是一次调用它,而是用较小的偏移量调用它几次,然后用较大和较大的偏移调用它,然后再调用较小的偏移量。我担心要让它看起来很光滑很难。

但是,如果这不起作用,可能会更改contentOffset块内的UIView animateWithDuration:delay:options:animations:completion值。也许如果您使用UIViewAnimationOptionCurveEaseInOut,您可以获得想要只调用一次的效果。如果没有,请在每个部分运行几个动画,并在减速之前覆盖更远和更远的距离。

相关问题