我有一个看起来像这样的自定义控件:
它允许您选择从 1 到 10 的乘数。在其中是滚动视图,其中包含多个 UILabel。每个标签都有标签并使用标签计算标签所需的位置。
用户可以滑动以移动它或点击数字以使其自动移动。
但是我遇到了这个问题 - 如果视图正在滚动并且我在滚动时点击数字,它不会停止在我点击的数字上,而是在其他一些数字上。
当滚动视图不滚动时,点击工作正常。以下是相关代码:
此方法需要在结束滚动时停止在数字上:
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
NSInteger targetIndex = targetContentOffset->x / (self.frame.size.width / 4.0) ;
*targetContentOffset = CGPointMake((targetIndex) * (self.frame.size.width / 4.0), targetContentOffset->y);
if (targetIndex > [self.dataSource numberOfItemsInPicker:self] - 1) {
targetIndex = [self.dataSource numberOfItemsInPicker:self] - 1;
}
if (self.gameName) {
for (int i=0; i<self.labels.count; i++) {
UILabel *label = self.labels[i];
if (i == targetIndex) {
label.textColor = [GeneralHelper colorForGame:self.gameName];
}
else {
if ([self.delegate respondsToSelector:@selector(colorForTextForSmallNumberPicker:)]) {
label.textColor = [self.delegate colorForTextForSmallNumberPicker:self];
}
}
}
}
if (self.delegate) {
[self.delegate smallNumberPickerView:self didPickNumberAtIndex:targetIndex];
}
}
这是确定滚动视图中标签位置的代码:
- (CGPoint)offsetForIndex:(NSUInteger)index
{
return CGPointMake(roundf((self.frame.size.width / 4.) * index), 0.);
}
我认为这是处理点击手势识别器的违规代码:
- (void)handleTapGesture:(UIGestureRecognizer *)recognizer
{
if (recognizer.state != UIGestureRecognizerStateEnded) {
return;
}
[self.scrollView setContentOffset:[self offsetForIndex:recognizer.view.tag - LABELS_START_TAG] animated:YES];
}
我的想法是在滚动帧期间发生错误,或者位置错误,但我不知道如何处理。我注意到当我点击我的 NSLog 目标偏移时,它是错误的,如果它没有滚动 - 我会得到正确的偏移。我能做些什么呢?