按下button时如何切换标签的隐藏?

我想弄清楚如何只显示一个标签,而在操作系统按下button。 我知道如何操作触摸事件,但我不确定如何将UILongPressGestureRecognizer合并到此。

UIButton类以及许多其他UIControl子类可以有很多动作连接起来。

当我们将一个动作从界面生成器连接到我们的源代码文件时,如果我们打开“Event”下拉菜单,我们会看到一长串选项:

选择IBAction事件

在几乎所有的情况下,我们都把我们的行为仅限于“Touch Up Inside”。 这允许用户考虑他们是否真的想按下button。 如果他们在放开之前将手指从button上拉开,则动作不会被触发,因为“向上触摸”手势发生在对象的边界之外。

但是在这里,我们希望实际上把我们的button的“触摸”事件挂上去。 这是我们将显示标签的时间。

让我们继续创build一个“接触”事件和一个“接触内部”事件:

迅速

 @IBAction func buttonTouchDown(sender: UIButton) { self.myLabel.hidden = false } @IBAction func buttonTouchEnded(sender: UIButton) { self.myLabel.hidden = true } 

Objective-C的

 - (IBAction)buttonTouchDown:(UIButton *)sender { self.myLabel.hidden = NO; } - (IBAction)buttonTouchEnded:(UIButton *)sender { self.myLabel.hidden = YES; } 

到目前为止, buttonTouchEnded是完全正常设置的,而buttonTouchDown是通过从“Event”列表中select“touch down”来设置的。

我们可以随时通过在界面构build器中右键单击来validation我们的控件所关联的内容:

按钮发送事件

但是这个菜单不仅仅是简单地检查我们已经连接的东西。 从这里,我们可以简单地通过点击圆圈并拖动到现有的方法来将其他任何动作连接到我们现有的@IBAction方法。

所以我们显然希望标签消失,如果我们停止按下button,一个正常的接触,就像你连接任何其他button。 剩下的唯一问题是,你想要什么确切的行为?

如果只有手指抬起时,标签才会消失,不pipe手指在哪里,我们也必须挂上“外面触摸”。

如果当用户将手指拖离button时,标签消失,我们应该勾住“触摸拖动退出”动作。

我们也可能想要连接“取消触摸”动作,如果某种系统事件(也许是来电)取消了触摸,就会发生这种情况。

这个堆栈溢出的答案阐述了我们所拥有的动作选项之间的差异,所以你可以准确地制定出你需要的行为。

无论如何,一旦我们决定了哪些操作我们想要连接到哪些方法,请调出右键单击菜单并从圆圈中单击拖动到方法:

挂钩“触摸取消”buttonTouchEnded(发件人:)

最简单的做法是将一个动作添加到touchDown事件,另一个动作是touchUpInside和touchUpOutside。

在touchDown动作上显示标签,并将其隐藏在touchUpInside / touchUpOutside动作中。 (为了完整性,接触取消,正如nhgrif在他的非常详细的回答中所build议的那样)。

长按手势识别器在这种情况下将不起作用。 您可以创build一个自定义的手势识别器,触发一个事件,并释放另一个事件,并使用它。 其实并不难。

编辑

我刚刚上传了一个演示项目到GitHub,名为“ MorphingButton ”(链接),我在Stack Overflow的另一个问题上创build了这个项目。

该项目现在显示一个标签,当您释放button时,触摸应用程序button并隐藏标签。

该项目是一个混合的Swift / Objective-C项目,展示了如何在两种语言中执行button变形和标签显示/隐藏。 它有一个带有Swift选项卡和Objective-C选项卡的选项卡栏。