0

我有一个看起来像这样的自定义控件:

在此处输入图像描述

它允许您选择从 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 目标偏移时,它是错误的,如果它没有滚动 - 我会得到正确的偏移。我能做些什么呢?

4

1 回答 1

0

计算出现错误。这一行:

return CGPointMake(roundf((self.frame.size.width / 4.) * index), 0.);

它除以 4 但标签实际上比选择器的 1/4 小,所以我得到了错误的结果。

于 2013-11-16T14:05:27.483 回答