【问题标题】:iOS 7.1 UITapGesture not working with UIPickerViewiOS 7.1 UITapGesture 不适用于 UIPickerView
【发布时间】:2014-04-14 16:38:06
【问题描述】:

我们使用UIPickerView 来允许用户从选项列表中进行选择。我们将 UIPickerView 添加为容器 UIView 的子视图。然后我们将一个 UITapGestureRecognizer 添加到容器UIViewUITapGestureRecognizer 被用来通过删除它的超级视图来关闭选择器。

在 iOS 7.0 和以前的版本中,这按预期工作。但是,在 iOS 7.1 中,这种设置不再有效,因为UITapGestureRecognizer 无法识别点击并调用操作中指定的选择器(关闭选择器视图和容器视图)。代码如下

   - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.nameList=[[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C", nil];
    UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
    myPickerView.delegate = self;
    myPickerView.showsSelectionIndicator = YES;
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapInListPickerView:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [myPickerView addGestureRecognizer:singleTap];
    [self.view addSubview:myPickerView];
}

-(void)tapInListPickerView:(UIGestureRecognizer *)sender

{
    NSLog(@"Taped in pikcer view");
}

如果需要任何其他信息,或者如果有更好的方法可以做到这一点,请告诉我。

【问题讨论】:

  • 请出示一些代码。
  • @Raptor 感谢您的回复,我在我的问题中添加了代码
  • 7.1 beta 中报告了此问题。目前似乎还没有解决。
  • 这绝对是一个错误。设置 numberOfTapsRequired=2 确实按预期工作。

标签: uipickerview uitapgesturerecognizer ios7.1


【解决方案1】:

我已经设法几乎通过子类化 UIPickerView 并覆盖 hitTest 实现来恢复原始功能。新实现首先允许选择器的所有行声明触摸事件,然后我最终允许选择器本身声明它。

我说几乎是因为 UIPickerView 发生了另一个变化,其中在选择器中可见的视图可能不再存在。因此,用户可以点击未在选择器中居中的行的可见图像,这可能会导致选择器滚动而不是选择该行,因为它不再存在。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (self.hidden) {
        return nil;
    }
    else {
        if (event.type == UIEventTypeTouches) {
            for (int component = 0; component < self.numberOfComponents; component++) {
                for (int row = 0; row < [self numberOfRowsInComponent:component]; row++) {
                    UIView *view = [self viewForRow:row forComponent:0];
                    if (view) {
                        view = [view hitTest:[self convertPoint:point toView:view] withEvent:event];
                        if (view) {
                            return view;
                        }
                    }
                }
            }
        }
        return [super hitTest:point withEvent:event];
    }
}

【讨论】:

  • 我尝试了您的解决方案,但单击时仍未调用委托操作。我看不出这个实现如何改变报告的行为。
  • 我应该提到我也停止使用附加到 UIPickerView 的手势。我现在允许内容对象(在我的例子中恰好是 UIButton 的)管理它们自己的触摸。
【解决方案2】:

我有同样的问题,我终于有一个启示:P

就像 uiPickerView 上的同时手势识别器不起作用。

所以我使用手势委托

<
UIGestureRecognizerDelegate>

 // add tap gesture
    UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)];
    [picker addGestureRecognizer:gestureRecognizer];
    gestureRecognizer.delegate = self;

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

然后它的工作!

再见

【讨论】:

  • 救命!这打破了我发布的应用程序中的一个全新功能,现在已修复。谢谢。
  • 这行得通。在 iOS 7.1 之前,我曾经在 UIPickerView 实例上设置 cancelsTouchesInView = NO。
  • 非常感谢。这就是我要找的!
  • 这是干净和完美的。非常感谢!
【解决方案3】:

接受的答案非常有帮助,谢谢!我已经继承了 UIPickerView。因此,在 ZDidier 之后,我将子类设为 UIGestureRecognizerDelegate,然后像这样覆盖 addGestureRecognizer

- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
    gestureRecognizer.delegate = self;
    [super addGestureRecognizer:gestureRecognizer];
}

这为我解决了问题。

【讨论】:

    【解决方案4】:

    试试这个溶胶:

    gestureRecognizer设置为true,在所有ios版本中检测

    第一步:添加UIGestureRecognizerDelegate

    第 2 步:将以下代码添加到您的类文件中

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

    【讨论】:

      【解决方案5】:

      懒人的 Swift 方法:

      符合协议UIGestureRecognizerDelegate

      override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
          return true
      }
      

      【讨论】:

        猜你喜欢
        • 2014-07-18
        • 2016-01-21
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多