为什么将UILabel设置为完全透明会丢失轻击手势?

时间:2013-01-05 09:13:24

标签: ios uikit uigesturerecognizer uiviewanimation

我无法理解这一点,我认为this也不能解释它。

我有UILabel可供用户点按以隐藏或显示它,设置如下:

self.numberLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(hideOrShowNumber)];
[self.numberLabel addGestureRecognizer:tapGesture];

我想通过在alpha上设置UILabel值来设置隐藏和显示标签的动画。但是,如果我将alpha值设置为0.0f,则标签不再接受点击,因此即使用户可以隐藏标签,她也无法再显示它!

我的解决方法是这样的:

隐藏标签时: - 将alpha值设置为0.0f的动画。 - 将标签的文本颜色设置为黑色(这使其不可见,因为背景为黑色) - 将alpha重置为1.0f。

显示标签时: - 将alpha设置为0.0f(因为隐藏标签时它保留在1.0f)。 - 将文本颜色设置为黑色以外的其他颜色(取决于游戏状态)。 - 将alpha值设置为1.0f。

代码如下所示(包含一些状态变量,但self.numberLabel是对UILabel的引用):

NSTimeInterval duration = 0.6f;

if (self.numberIsVisible) {
    [UIView animateWithDuration:duration
                     animations:^{
                         self.numberLabel.alpha = 0.0f;
                     }
                     completion:^(BOOL done) {
                         self.numberLabel.textColor = [UIColor blackColor];
                         self.numberLabel.alpha = 1.0f;
                     }
    ];
    self.numberIsVisible = NO;
}
else {
    UIColor *rightColor = [UIColor whiteColor];

    if ([GameState sharedGameState].haveMatch) {
        rightColor = [UIColor colorWithRed:0.0/255.0 green:127.0/255.0 blue:255.0/255.0 alpha:1.0];
    }

    self.numberLabel.alpha = 0.0f;
    self.numberLabel.textColor = rightColor;

    [UIView animateWithDuration:duration
                     animations:^{
                         self.numberLabel.alpha = 1.0f;
                     }
    ];

    self.numberIsVisible = YES;
}

它有效,但它有点笨重。

所以问题是,为什么设置UILabel的透明度会让它失去用户互动?这是设计,是否记录在某处?我在UIGestureRecognizer文档中找不到任何相关内容。

6 个答案:

答案 0 :(得分:3)

来自官方doc规范触摸事件投放部分

  

关闭触摸事件的传递。默认情况下,视图会收到   触摸事件,但您可以将其userInteractionEnabled属性设置为   不关闭触摸事件的传递。 视图也不会收到   这些事件如果被隐藏或者是透明的

在视图上具有完全透明度(alpha = 0)被认为与隐藏视图类似,因此在这种情况下没有理由进行用户交互。您可以尝试使用几乎透明的UILabel0.1的alpha似乎是限制。

答案 1 :(得分:2)

似乎任何具有<< 0.1f就像隐藏属性设置为YES一样。换句话说,由于您的视图是透明的,因此它不会接收触摸事件。见post

答案 2 :(得分:2)

至少在iOS 8中,您可以将alpha设置为0.01(不再是限制0.1)并触发触摸事件。如果是0.0,则不会触发触摸事件。

更新:我发现在iOS 8.2及更早版本中,限制为0.001960785。非常接近完全透明。也许这个数字可能更小,我没有进一步取小数位。

答案 3 :(得分:1)

显然这种行为过去是有记录的,但我无法在当前的文档中找到它。

请参阅此答案:Why doesn't touchesBegan fire on UIViews when alpha is set to zero?

"默认情况下,视图会接收触摸事件,但您可以将其userInteractionEnabled属性设置为NO以关闭事件传递。如果视图被隐藏或者透明,则视图也不会接收事件。"

您隐藏的UILabel没有理由需要与接收触摸的视图相同。一个更简单的解决方法是:

  1. 添加一个包装UIView,让用户可以点按
  2. 将手势识别器添加到包装器视图
  3. 使手势识别器的操作隐藏或显示标签

答案 4 :(得分:0)

按照设计,当alpha设置为0时,视图不会接收到触摸。您可以尝试将alpha设置为0.1。检查苹果链接https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html

答案 5 :(得分:0)

我通过创建包含空格的UILabel来解决这个问题,然后根据需要使用Autolayout约束来增长/缩小。