我正在尝试使用 UIPicker 视图,其行为与 iPhone 代码示例中通常看到的行为有所不同。
我想要做的是允许用户滚动选择器内容,而不是自动选择选择器的行(使用选择器委托的“didSelectRow”方法)。相反,我希望允许用户触摸选择器的中心行,该行被突出显示并成为选择。
有什么办法可以做到这一点?
提前致谢。
我正在尝试使用 UIPicker 视图,其行为与 iPhone 代码示例中通常看到的行为有所不同。
我想要做的是允许用户滚动选择器内容,而不是自动选择选择器的行(使用选择器委托的“didSelectRow”方法)。相反,我希望允许用户触摸选择器的中心行,该行被突出显示并成为选择。
有什么办法可以做到这一点?
提前致谢。
向 UIPickerView 添加手势识别器,触发对象中的目标方法:
myGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerTapped:)];
[myPicker addGestureRecognizer:myGR];
// target method
-(void)pickerTapped:(id)sender
{
// your code
}
制作一个新的 UIControl
[yourcontrol setBackGroundColor: [UIColor clearColor]];
做一个方法
- (IBAction)pickerControlTapped { [yourpicker selectRow: rand()% yourpickersize 在组件:0 动画:是]; }
.3. 在 1 和 2 之间建立联系
[你的控制添加目标:自我 动作:@selector(pickerControlTapped) forControlEvents: UIControlEventTouchUpInsied];
基于 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
}
}
}
对于这个问题,我有一个相对简单的解决方案,对我来说效果很好。使用隐藏的自定义按钮,您可以在没有手势识别器的情况下实现点击功能。该解决方案适用于具有一个组件的选择器,但我确信它可以适应更多组件。
首先在 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;
}
}
我已经从工作代码中稍微修改了这个答案的代码,所以如果它被破坏了,我深表歉意。
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: