Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么将UILabel设置为完全透明会丢失点击手势?_Ios_Uikit_Uigesturerecognizer_Uiviewanimation - Fatal编程技术网

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

Ios 为什么将UILabel设置为完全透明会丢失点击手势?,ios,uikit,uigesturerecognizer,uiviewanimation,Ios,Uikit,Uigesturerecognizer,Uiviewanimation,我无法理解这一点,我也不认为这能真正解释这一点 我有一个ui标签,用户可以点击它来隐藏或显示它,设置如下: self.numberLabel.userInteractionEnabled = YES; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideOrShowNumber)]; [self.numberLabel

我无法理解这一点,我也不认为这能真正解释这一点

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

self.numberLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(hideOrShowNumber)];
[self.numberLabel addGestureRecognizer:tapGesture];
我想通过设置
UILabel
上的
alpha
值来设置标签隐藏和显示的动画。但是,如果我将alpha值设置为
0.0f
,标签将不再接受点击,因此即使用户可以隐藏标签,也无法再显示它

我的解决方法如下:

self.numberLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(hideOrShowNumber)];
[self.numberLabel addGestureRecognizer:tapGesture];
隐藏标签时: -将alpha值设置为0.0f的动画。 -将标签的文本颜色设置为黑色(由于背景为黑色,因此不可见) -将alpha重置为1.0f

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

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

它能用,但有点笨重

所以问题是,为什么设置
UILabel
的透明度会让它失去用户交互?这是设计的吗?是否有文档记录?我在
UIgestureRecognitizer
文档中找不到任何关于此的信息。

来自官方(监管触摸事件交付部分

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


在视图上具有完全透明性(alpha=0)被认为与隐藏视图相似,因此在这种情况下没有必要处理用户交互。您可以尝试使用几乎透明的

UILabel
。α值
0.1
似乎是极限值。

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

看看这个答案:

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

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

  • 添加您希望用户能够点击的包装器UIView
  • 将手势识别器添加到包装器视图
  • 让手势识别器的动作只是隐藏或显示标签

  • 似乎任何alpha值小于0.1f的UIView都会将隐藏属性设置为“是”。换句话说,因为您的视图是透明的,所以它不会接收触摸事件。看这个

    根据设计,当alpha设置为0时,视图将不会收到触摸。您可以尝试将alpha设置为0.1。检查apple链接。

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


    更新:我发现在iOS 8.2或更早版本中,限制为0.001960785。非常接近完全透明。也许这个数字会更小,我不再保留小数点。

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

    请看一下Ole Begemann的OBShapedButton——他的代码应该可以帮助您解决这个问题。@rokjarc谢谢,但我有一个解决方法(见上文),另外一个组件在这方面做得太过火了。我对标签很满意,我不需要非矩形按钮。所以这不是一个真正的问题;我在问为什么会这样。就我个人而言,我认为“隐藏”与(完全)“透明”略有不同,但正如许多答案中所指出的,UIKit的想法似乎有所不同。嗨,Jere,我不认为你会使用OBShapedButton而不是标签。我们的想法是看看如何处理这个透明度/触摸问题:使用立方体分类和hitTest。好的,我明白了。是的,这是一个有趣的想法,OB有很多很棒的东西。