我想做的是:
显示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");
}
触摸选择器时,这些事件都不会触发。
关于如何检测用户是否触摸选择器中突出显示/选定行的任何想法?
答案 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
因为我们现在正在自行检测选择。