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的命令语法.