8

我想实现以下目标。

场景:iOS 键盘在用户输入特定文本字段时显示在屏幕上。用户可以点击键盘和文本字段之外的任何地方来关闭键盘(无需激活任何可见的按钮)。此外,用户可以在键盘外拖动并观察一些可滚动视图排列的正常拖动行为。

从概念上讲,我UIView在大部分屏幕上放置了一个“封面”,其行为如下:

  1. 如果用户点击封面,那么我会捕获该点击(以便我可以,例如,关闭键盘)。这很容易通过在UIView子类中拦截触摸事件或使用轻击手势识别器来实现。

  2. 如果用户在封面上拖动,则封面忽略转发这些触摸;这些被下面的层接收,就像没有盖子一样。

所以:用户应该能够滚动封面下方的内容,但不能点击封面下方的内容。在键盘和文本字段的“外部”轻按应该会关闭键盘(和封面),但不应激活任何东西。

我怎样才能做到这一点?

4

3 回答 3

2

以通常的方式添加点击手势:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.view addGestureRecognizer:tapGesture];

但是您可能正在寻找的是:

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

文档说:当通过gestureRecognizer 或otherGestureRecognizer 识别手势会阻止其他手势识别器识别其手势时调用此方法。(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate

这样,您可以确定它是完全透明的,并且没有什么会阻止您的识别器被调用。

于 2012-11-16T08:45:08.437 回答
1

转发它收到的所有触摸的自定义视图:

class CustomView: UIView {

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {

        var hitView = super.hitTest(point, withEvent: event)

        if hitView == self {
            return nil
        }

        return hitView
    }    
}

从那里您可以采用不同的方式来使用轻按手势。要么观察 UIEvent 的触摸,要么使用手势识别器。

于 2015-08-27T17:15:17.367 回答
0

1:在视图中添加点击手势识别器:

    //Adding tap gesture
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
    tapGesture.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:tapGesture];

2:在handleTapGesture中你resignFirstResponder的键盘

- (void)handleTapGesture:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateRecognized) {
       //Resign first responder for keyboard here
    }
}

对上面的答案进行了详细说明。UIGestureRecognizerStateRecognized 确保它是被识别的单个选项卡事件。

这是您追求的功能吗?

于 2012-11-16T08:32:09.417 回答