2

我将如何将手势事件添加到 uipickerview 以更改选项卡?我必须创建一个自定义类,但是,我不知道如何处理 uipickerview。我目前在 uiviews 中有手势来执行此操作,但我在使用 uipickerview 时遇到了问题。

我的视图代码:

#define HORIZ_SWIPE_DRAG_MIN 100
CGPoint mystartTouchPosition;
BOOL isProcessingListMove;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint newTouchPosition = [touch locationInView:self.view];
    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) {
        isProcessingListMove = NO;
    }
    mystartTouchPosition = [touch locationInView:self.view];
    [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = touches.anyObject;
    CGPoint currentTouchPosition = [touch locationInView:self.view];

    // If the swipe tracks correctly.
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero

    if(abs(diffx / diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN)
    {
        // It appears to be a swipe.
        if(isProcessingListMove) {
            // ignore move, we're currently processing the swipe
            return;
        }

        if (mystartTouchPosition.x < currentTouchPosition.x) {
            isProcessingListMove = YES;
            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0];
            return;
        }
        else {
            isProcessingListMove = YES;

            self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2];

            return;
        }
    }
    else if(abs(diffy / diffx) > 1)
    {
        isProcessingListMove = YES;
        [super touchesMoved:touches withEvent:event];
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    isProcessingListMove = NO;
    [super touchesEnded:touches withEvent:event];
}

谢谢您的帮助。

4

4 回答 4

2

你可以继承 UIPickerView。问题是它由九个子视图组成,其中一个称为 UIPickerTable,正在接收触摸事件,例如touchesBegan:withEvent:您想要的行。我能够使用本文末尾包含的代码成功拦截这些: Responding to touchesBegan in UIPickerView 而不是 UIView

那里的其他答案/评论也很有帮助。我想澄清一下,不是为了做一些非标准的事情的人(如在这个问题中),而是为了那些来到这里希望继承 UIPickerView 的人,因为接受的答案的第一行是完全错误的。

于 2011-07-06T05:55:48.603 回答
0

我不管它。这会令人困惑,你是对的。

于 2010-02-16T19:09:19.650 回答
0

你不能继承 UIPickerView。

但是,由于选择器视图必须显示在另一个视图中(因为它不会占据整个屏幕),您可以在该视图的控制器中捕获触摸并过滤手势。

(假设我了解您要做什么...)我会警告说,滑动选择器视图以更改选项卡是非标准 UI,并且可能会使您的用户感到困惑。由于拾取器视图被视为一种控件,因此他们只会期望拾取器的正常旋转动作。他们怎么会知道水平滑动选择器视图?

于 2010-02-16T15:29:02.910 回答
-1

ZT> 你不能继承 UIPickerView。“为了使选取器视图旋转得更长,我将 UIPickerView 子类化。我的子类只有一种方法”,来自Longer Spinning 和 Blurring。另请参阅UIPickerView 类参考:“UIDatePicker 类使用 UIPickerView 的自定义子类来显示日期和时间。”

于 2011-03-14T02:46:34.230 回答