2

我想做的是:

显示了一个 UIPickerView。如果用户触摸选定的行,则该行被锁定(它是一个多组件选择器)并且其他组件可以自由旋转。如果该行已经被锁定并且用户触摸了被锁定的行,那么该行被解锁并且可以自由旋转。我已经使用按钮对锁定部分进行了编码。我想删除按钮并用突出显示的选择器选项替换。

我试过了:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
}

显然,这仅在尚未选择该行时触发,因此当我触摸突出显示区域中的行时,此事件不会触发。

然后我尝试了

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"touchesBegan");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"touchesMoved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"touchesEnded");
}

触摸拾取器时,这些事件都不会发生火灾。

关于如何检测用户何时触摸选择器中突出显示/选定的行的任何想法?

4

3 回答 3

2

嗯 - 有一个简单的解决方法,正是我想要完成的。基本上我想让用户点击多组件选择器视图上的选择栏并锁定该组件,而其他组件可以自由旋转。

这是我所做的:

首先 - 关闭选项以显示选择栏。

第二 - 创建三个标签 - 每个组件一个 - 标签与选择器栏的高度和位置相同,但每个组件都有一个。他们倒是彼此看起来是一个实心的酒吧。

第三 - 创建一个方法来更改标签的颜色以指示它已锁定给用户。我还使用布尔标志来让程序进程知道组件何时被锁定。

    - (IBAction) lockButtonPress:(id)sender {

    // determine which button was pressed....
    int btnPressed = 0;
    if (leftSelectionBar.touchInside) btnPressed = 1;
    if (centerSelectionBar.touchInside) btnPressed = 2;
    if (rightSelectionBar.touchInside) btnPressed = 3;

    // we are not going to make this difficult -- images for different states..... default in viewWillShow
    switch (btnPressed) {
        case 1:
            if (lockSelected0) {
                lockSelected0 = FALSE;
                [leftSelectionBar setBackgroundColor:[UIColor blueColor]];
                [leftSelectionBar setAlpha:0.25];
            } else {
                lockSelected0 = TRUE;
                [leftSelectionBar setBackgroundColor:[UIColor redColor]];
                [leftSelectionBar setAlpha:0.45];

            }
            break;
        case 2:
            if (lockSelected1) {
                lockSelected1 = FALSE;
                [centerSelectionBar setBackgroundColor:[UIColor blueColor]];
                [centerSelectionBar setAlpha:0.25];
            } else {
                lockSelected1 = TRUE;
                [centerSelectionBar setBackgroundColor:[UIColor redColor]];
                [centerSelectionBar setAlpha:0.45];
            }
            break;
        case 3:
            if (lockSelected2) {
                lockSelected2 = FALSE;
                [rightSelectionBar setBackgroundColor:[UIColor blueColor]];
                [rightSelectionBar setAlpha:0.25];
            } else {
                lockSelected2 = TRUE;
                [rightSelectionBar setBackgroundColor:[UIColor redColor]];
                [rightSelectionBar setAlpha:0.45];
            }
            break;
        default:
            break;
    }   
}

就是这样......简单;)

于 2009-11-05T13:55:30.697 回答
0

(void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { //这里自定义代码

//例如,如果您有一个名为“list”的 NSArray 或 NSMutableArray,其值显示在 UIPickerView - [list objectAtIndex:row] 其中 row 是 UIPickerView 事件返回的索引将返回对象本身。

}

于 2011-01-06T22:14:49.583 回答
0

以下代码片段将拦截 a 上的点击手势UIPickerView并确定点击是否在 的选择指示符内UIPickerView

首先,我们将添加一个UITapGestureRecognizer来拦截点击手势。请注意,我们不想取消触摸,因为UIPickerView它仍然应该做旋转轮子的事情。

- (void)viewDidLoad
{
   [super viewDidLoad];

   UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)];
   gestureRecognizer.cancelsTouchesInView = NO;

   [self.pickerView addGestureRecognizer:gestureRecognizer];
}

其次,我们将检查点击是否在 的选择指示符内UIPickerView(假设选择指示符使用了大约 15% 的高度UIPickerView- 您可能需要调整此值):

- (void)pickerViewTapGestureRecognized:(UITapGestureRecognizer*)gestureRecognizer
{
   CGPoint touchPoint = [gestureRecognizer locationInView:gestureRecognizer.view.superview];

   CGRect frame = self.pickerView.frame;
   CGRect selectorFrame = CGRectInset( frame, 0.0, self.pickerView.bounds.size.height * 0.85 / 2.0 );

   if( CGRectContainsPoint( selectorFrame, touchPoint) )
   {
      NSLog( @"Selected Row: %i", [self.currentArticles objectAtIndex:[self.pickerView selectedRowInComponent:0]] );
   }
}

你不应该实施

- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

因为我们现在自己检测选择。

于 2012-05-28T12:25:10.473 回答