UIScrollView具有许多可供程序员使用的信息,但是我没有看到一种明显的方法来控制控件从滚动手势减速后停止在的位置。

基本上,我希望scrollview可以捕捉到屏幕的特定区域。用户仍然可以像平常一样滚动,但是当他们停止滚动时, View 应捕捉到最相关的位置,并且在轻拂手势的情况下,减速也应在这些位置停止。

有没有一种简单的方法可以执行这样的操作,还是我应该考虑通过编写自定义滚动控件来达到这种效果的唯一方法?

最佳答案

由于UITableView是UIScrollView子类,因此可以实现UIScrollViewDelegate方法:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
    withVelocity:(CGPoint)velocity
    targetContentOffset:(inout CGPoint *)targetContentOffset

然后计算所需的最接近的目标目标偏移量,然后在inout CGPoint参数上进行设置。

我已经尝试过了,效果很好。

首先,像这样检索非引导偏移量:
CGFloat unguidedOffsetY = targetContentOffset->y;

然后通过一些数学运算找出您想要的位置,并注意表格标题的高度。这是我的代码中处理代表美国的自定义单元格的示例:
CGFloat guidedOffsetY;

if (unguidedOffsetY > kFirstStateTableViewOffsetHeight) {
    int remainder = lroundf(unguidedOffsetY) % lroundf(kStateTableCell_Height_Unrotated);
    log4Debug(@"Remainder: %d", remainder);
    if (remainder < (kStateTableCell_Height_Unrotated/2)) {
        guidedOffsetY = unguidedOffsetY - remainder;
    }
    else {
        guidedOffsetY = unguidedOffsetY - remainder + kStateTableCell_Height_Unrotated;
    }
}
else {
    guidedOffsetY = 0;
}

targetContentOffset->y = guidedOffsetY;

上面的最后一行实际上将值写回到inout参数中,该参数告诉滚动 View 这是您要捕捉的y偏移量。

最后,如果您正在处理获取的结果 Controller ,并且想知道刚刚捕获的内容,则可以执行以下操作(在我的示例中,“州”属性是美国的FRC)。我使用该信息来设置按钮标题:
NSUInteger selectedStateIndexPosition = floorf((guidedOffsetY + kFirstStateTableViewOffsetHeight) / kStateTableCell_Height_Unrotated);
log4Debug(@"selectedStateIndexPosition: %d", selectedStateIndexPosition);
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:selectedStateIndexPosition inSection:0];
CCState *selectedState = [self.states objectAtIndexPath:indexPath];
log4Debug(@"Selected State: %@", selectedState.name);
self.stateSelectionButton.titleLabel.text = selectedState.name;

主题外的注释:您可能已经猜到了,“log4Debug”语句只是在记录日志。顺便说一句,我为此使用Lumberjack,但我更喜欢旧Log4Cocoa的命令语法。

10-08 06:26