我正在尝试使用UIPicker视图,其行为与iPhone代码示例中常见的行为有所不同。
我想要做的是允许用户滚动选择器内容,而不是自动选择选择器的行(使用选择器委托中的“didSelectRow”方法)。相反,我希望允许用户触摸选择器的中心行,该行会突出显示,并成为选择。
有没有办法实现这个目标?
提前致谢。
答案 0 :(得分:15)
向UIPickerView添加手势识别器,触发对象中的目标方法:
myGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)];
[myPicker addGestureRecognizer:myGR];
// target method
-(void)pickerTapped:(id)sender
{
// your code
}
答案 1 :(得分:5)
制作新的UIControl
[yourcontrol setBackGroundColor: [UIColor clearColor]];
制作方法
- (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: