我有一个自定义控件,如下所示:
它允许您从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目标偏移并且它是错误的,如果它不滚动 - 我将得到正确的偏移。 我该怎么办?
答案 0 :(得分:0)
计算中出错。这一行:
return CGPointMake(roundf((self.frame.size.width / 4.) * index), 0.);
它除以4,但标签实际上小于拾取器的1/4,所以我得到了错误的结果。