允许用户通过点击选择UIPickerView行

时间:2010-03-08 17:28:50

标签: iphone objective-c xcode uipickerview

我正在尝试使用UIPicker视图,其行为与iPhone代码示例中常见的行为有所不同。

我想要做的是允许用户滚动选择器内容,而不是自动选择选择器的行(使用选择器委托中的“didSelectRow”方法)。相反,我希望允许用户触摸选择器的中心行,该行会突出显示,并成为选择。

有没有办法实现这个目标?

提前致谢。

5 个答案:

答案 0 :(得分:15)

向UIPickerView添加手势识别器,触发对象中的目标方法:

myGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)];
[myPicker addGestureRecognizer:myGR];

// target method

-(void)pickerTapped:(id)sender
{
// your code
}

答案 1 :(得分:5)

  1. 制作新的UIControl

    • 与UIPickerView相同的位置
    • [yourcontrol setBackGroundColor: [UIColor clearColor]];
  2. 制作方法

  3. - (IBAction) pickerControlTapped 
    {
        [yourpicker selectRow: rand()% yourpickersize
                  inComponent: 0
                     animated: YES];
    }
    

    0.3。在1和2之间建立连接

     
    [yourcontrol addTarget: self 
                    action: @selector(pickerControlTapped) 
          forControlEvents: UIControlEventTouchUpInsied];
    

答案 2 :(得分:2)

基于Martin Linklater的答案,支持点击拾取器的其他行: 有一些神奇的数字,但对我有用。

- (void) pickerTapped:(UITapGestureRecognizer*)gestureRecognizer
{
    CGPoint location = [gestureRecognizer locationInView:self.pickerView];

    CGFloat halfViewHeight = self.pickerView.frame.size.height / 2;

    NSInteger row = -1;
    if (location.y < halfViewHeight - 22
        && location.y > halfViewHeight - 66)
    {
        row = [self.pickerView selectedRowInComponent:0] - 1;
    }
    else if (location.y < halfViewHeight + 22
             && location.y > halfViewHeight - 22)
    {
        row = [self.pickerView selectedRowInComponent:0];
    }
    else if (location.y < halfViewHeight + 66
             && location.y > halfViewHeight + 22)
    {
        row = [self.pickerView selectedRowInComponent:0] + 1;
    }

    if (row >= 0 && row < [self.content count])
    {
        id element = [self.content objectAtIndex:row];

        if (element)
        {
            [self.pickerView selectRow:row inComponent:0 animated:YES];

            // do more stuff
        }
    }
}

答案 3 :(得分:1)

我对这个问题有一个相对简单的解决方案,对我来说效果很好。使用隐藏的自定义按钮,您可以在没有手势识别器的情况下实现点按功能。这个解决方案适用于带有一个组件的选择器,但我确信它可以适应更多的工作。

首先在Interface Builder中或以编程方式添加一个按钮。将其隐藏并与拾取器一样宽,然后放置它,使其恰好位于拾取器的中心,也位于视图层次结构的前面。

我正在使用这样的IBAction来展示我的选择器。但是,你如何展示和隐藏选择器真的取决于你。

- (IBAction)showPicker:(id)sender
{
    _picker.hidden = NO;
    _buttonPicker.hidden = NO;
}

选择选择器值的所有操作都发生在UIControlEventTouchUpInside事件的IBAction中,如下所示。

- (IBAction)selectPicker:(id)sender
{
    //Hide the button so that it doesn't get in the way
    _buttonPicker.hidden = YES;

    //Make sure we're within range
    NSInteger max = _values.count;
    NSInteger row = [_picker selectedRowInComponent:0];
    if(row >= 0 && row < max) {
        NSString *value = [_values objectAtIndex:row];

        //Set the label value and hide the picker
        _label.text = value;
        _picker.hidden = YES;
    }
}

我已经从工作代码中略微修改了这个答案的代码,如果它完全被破坏就道歉。

答案 4 :(得分:0)

UIPickerView只有2个代表。

因此,我们只能使用7种方法来控制委托UIPickerView。

- pickerView:rowHeightForComponent:
- pickerView:widthForComponent:
- pickerView:titleForRow:forComponent:
- pickerView:viewForRow:forComponent:reusingView:
- pickerView:didSelectRow:inComponent:
- numberOfComponentsInPickerView:
- pickerView:numberOfRowsInComponent:

that'all。

UITableViewDelegate case中,UITableView有更多方法可用于管理选择。 如, - tableView:willSelectRowAtIndexPath:
- tableView:didSelectRowAtIndexPath:
- tableView:willDeselectRowAtIndexPath:
- tableView:didDeselectRowAtIndexPath:

...然而

在UIPickerViewDelegate案例中,只有一种方法可以响应行选择。

- pickerView:didSelectRow:inComponent: