检测用户在UIDatePicker中点击选择指示符的时间?

时间:2011-09-17 14:01:47

标签: iphone objective-c

如何检测用户何时点击UIDatePicker中的选择指标?

如果没有这个,用户必须滚动到其他日期然后再返回以选择日期选择器滑动时选择指示器下显示的日期。

非常感谢,
斯坦

The date picker is scrolled to current date when sliding up

更新:这是我能想出的唯一解决方案:

UIDatePicker *aDatePicker = [[UIDatePicker alloc] init];
self.datePicker = aDatePicker;
[aDatePicker release];
[self.datePicker addTarget:self action:@selector(datePicked:) forControlEvents:UIControlEventValueChanged];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(datePicked:)];    
[self.datePicker addGestureRecognizer:tap];
[tap release];

这意味着当用户实际旋转滚轮时,datePicked将被调用两次。

更新:上述解决方案不适用于UIPickerViews。在这些情况下,我不知道如何实现通缉行为。

3 个答案:

答案 0 :(得分:5)

你可以用这种方式做一些调整: -

在您的.h文件中声明代理<UIGestureRecognizerDelegate>

UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)];
[yourDatePicker addGestureRecognizer:gestureRecognizer];
gestureRecognizer.delegate=self;
gestureRecognizer.numberOfTapsRequired=2;//Whenever you do double tap it will called. So allow user to do double tap on selected date.

//下面是Delegate方法

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

//双击时会触发下方法

-(void)pickerViewTapGestureRecognized:(UITapGestureRecognizer*)recognizer
{
   UIDatePicker *datePicker=(UIDatePicker*)[[recognizer view] viewWithTag:101];
   NSLog(@"datePicker=%@", datePicker.date);
 }

答案 1 :(得分:2)

试试这段代码:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapped:)];

[recognizer setNumberOfTapsRequired:2];
[recognizer setCancelsTouchesInView:NO];
[recognizer setDelaysTouchesEnded:NO];
[recognizer setDelaysTouchesBegan:NO];

[self.answerPicker addGestureRecognizer:recognizer];

// ....

- (IBAction)pickerViewTapped:(UITapGestureRecognizer *)sender {
    CGPoint coord = [sender locationInView:self.answerPicker];
    if(coord.y <= 126 && coord.y >= 90) {
        //do something
    }
}

答案 2 :(得分:1)

这是一个老问题,但这是我为了抓住UIDatePicker上的选择栏rect所做的。有了这个,你可以添加一个带有手势识别器的按钮/视图来检测水龙头。这有点像黑客,但它似乎在iOS6和iOS7中运行良好。

+ (CGRect)getSelectionBarRectFromPicker:(UIDatePicker *)picker
{
    int counter = 0;
    CGRect selectionBarRect;
    for(UIView *datePickerView in picker.subviews){
        for(UIView *subview in datePickerView.subviews){
            if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0){
                if([NSStringFromClass([subview class]) isEqualToString:@"_UIPickerViewSelectionBar"]){
                    if(counter == 0){
                        selectionBarRect.origin = subview.frame.origin;
                        selectionBarRect.size.height = subview.frame.size.height;
                    }
                    selectionBarRect.size.width += subview.frame.size.width;
                    counter++;
                }
            } else {
                if(subview.frame.size.height < 1){
                    if(counter == 0){
                        selectionBarRect.origin = subview.frame.origin;
                        selectionBarRect.size.width = subview.frame.size.width;
                    } else {
                        selectionBarRect.size.height = subview.frame.origin.y - selectionBarRect.origin.y;
                    }
                    counter++;
                }
            }
        }
    }
    return selectionBarRect;
}