UIPickerView - 突出显示行时触发的事件

时间:2009-10-28 10:52:06

标签: iphone uipickerview

我想做的是:

显示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");
}

触摸选择器时,这些事件都不会触发。

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

3 个答案:

答案 0 :(得分: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;
    }   
}

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

答案 1 :(得分:0)

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

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

}

答案 2 :(得分:0)

以下代码段将截取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的选择指标内(假设选择指标使用UIPickerView高度的约15% - 您可能需要调整此值):

- (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

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