我正在尝试通过点击按钮以编程方式滚动UITableView。在手动操作时应该是相同的效果,或者在滚动时间内更长一点。
首先我尝试使用 scrollToRowAtIndexPath:atScrollPosition:animated:但是它太快并且及时修复。它也没有任何加速和减速。
任何想法如何以编程方式滚动UITableView,因为它已经手动滚动?我正在考虑向它发送一些自定义触摸。你认为它可行吗?
非常感谢任何想法和帮助!谢谢!
答案 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,您可以获得想要只调用一次的效果。如果没有,请在每个部分运行几个动画,并在减速之前覆盖更远和更远的距离。