cocoa-touch – UIScrollView – 减速时捕捉控制

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

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

有没有一种简单的方法来做这样的事情,或者我应该考虑实现这种效果的唯一方法来编写自定义滚动控件?

解决方法

由于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参数中,该参数告诉滚动视图这是您希望它捕捉到的y偏移量.

最后,如果你正在处理一个获取的结果控制器,并且你想知道什么被捕获,你可以做这样的事情(在我的例子中,属性“states”是美国各州的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;

OFF-TOPIC注意:正如您可能猜到的那样,“log4Debug”语句只是记录.顺便说一下,我正在使用Lumberjack,但我更喜欢旧Log4Cocoa的命令语法.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...