3

我无法弄清楚这一点,我认为也不能真正解释它。

我有一个UILabel可以被用户点击来隐藏或显示它,设置如下:

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

我想通过alphaUILabel. 但是,如果我将 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我在文档中找不到任何关于此的内容。

4

6 回答 6

3

来自官方文档Regulating Touch Event Delivery 部分

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

在视图上具有完全透明度(alpha = 0)被认为与隐藏视图相似,因此在这种情况下没有理由处理用户交互。您可以尝试使用几乎透明的UILabel方式。一个 alpha0.1似乎是极限。

于 2013-01-05T09:18:19.903 回答
2

似乎任何具有 < 0.1f 的 alpha 的 UIView 的行为都好像 hidden 属性设置为 YES。换句话说,由于你的视图是透明的,它不会接收到触摸事件。看到这个帖子

于 2013-01-05T09:28:31.653 回答
2

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

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

于 2014-07-14T04:51:05.690 回答
1

显然这种行为曾经被记录在案,但我在当前文档中找不到它。

请参阅此答案:当 alpha 设置为零时,为什么 touchesBegan 不会在 UIViews 上触发?

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

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

  1. 在您希望用户能够点击的地方添加一个包装器 UIView
  2. 将手势识别器添加到包装视图
  3. 使手势识别器的动作只是隐藏或显示标签
于 2013-01-05T09:26:45.493 回答
0

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

于 2013-01-05T21:52:36.340 回答
0

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

于 2015-07-09T15:48:56.743 回答