11

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

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

有什么办法可以做到这一点?

提前致谢。

4

5 回答 5

15

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

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

// target method

-(void)pickerTapped:(id)sender
{
// your code
}
于 2011-10-28T10:49:39.443 回答
5
  1. 制作一个新的 UIControl

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

- (IBAction)pickerControlTapped
{
    [yourpicker selectRow: rand()% yourpickersize
              在组件:0
                 动画:是];
}

.3. 在 1 和 2 之间建立联系

 
[你的控制添加目标:自我
                动作:@selector(pickerControlTapped)
      forControlEvents: UIControlEventTouchUpInsied];
于 2010-03-10T01:23:46.183 回答
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
        }
    }
}
于 2012-08-03T01:45:46.020 回答
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;
    }
}

我已经从工作代码中稍微修改了这个答案的代码,所以如果它被破坏了,我深表歉意。

于 2012-12-07T01:26:17.497 回答
0

UIPickerView 只有 2 个代表。

所以,我们只能使用 7 种方法来通过委托来控制 UIPickerView。

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

仅此而已。

UITableViewDelegate 案例中,UITableView 有更多的方法来管理选择。例如, – tableView:willSelectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:
– tableView:willDeselectRowAtIndexPath:
– tableView:didDeselectRowAtIndexPath:

然而...

在 UIPickerViewDelegate 的情况下,只有一种方法可以响应行选择。

–pickerView:didSelectRow:inComponent:

于 2010-03-09T00:45:34.967 回答