Scrollview在自定义控件上滚动错误

时间:2013-11-07 11:15:13

标签: ios uiscrollview

我有一个自定义控件,如下所示:

enter image description here

它允许您从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目标偏移并且它是错误的,如果它不滚动 - 我将得到正确的偏移。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

计算中出错。这一行:

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

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