【发布时间】:2015-06-09 22:31:43
【问题描述】:
我试图弄清楚如何在操作系统中按下按钮时仅显示标签。我知道如何操作触摸事件,但我不确定如何将 UILongPressGestureRecognizer 合并到其中。
【问题讨论】:
标签: ios uibutton uikit uilabel
我试图弄清楚如何在操作系统中按下按钮时仅显示标签。我知道如何操作触摸事件,但我不确定如何将 UILongPressGestureRecognizer 合并到其中。
【问题讨论】:
标签: ios uibutton uikit uilabel
UIButton 类以及许多其他 UIControl 子类可以与许多操作相关联。
当我们将界面生成器中的操作连接到源代码文件时,如果我们打开“事件”下拉菜单,我们会看到一长串选项:
在几乎所有场景中,我们都只将我们的动作与“Touch Up Inside”挂钩。这允许用户考虑他们是否想要真正按下按钮。如果他们在松开按钮之前将手指从按钮上拖开,则不会触发动作,因为“向上触摸”手势发生在对象边界之外。
但是在这里,我们想要真正挂钩按钮的“触地”事件。这是我们将显示标签的时候。
让我们继续创建一个“touch down”事件和一个“touch up inside”事件:
@IBAction func buttonTouchDown(sender: UIButton) {
self.myLabel.hidden = false
}
@IBAction func buttonTouchEnded(sender: UIButton) {
self.myLabel.hidden = true
}
- (IBAction)buttonTouchDown:(UIButton *)sender {
self.myLabel.hidden = NO;
}
- (IBAction)buttonTouchEnded:(UIButton *)sender {
self.myLabel.hidden = YES;
}
到目前为止,buttonTouchEnded 设置完全正常,buttonTouchDown 是通过从“事件”列表中选择“触地”设置的。
我们始终可以通过在界面构建器中右键单击它来验证我们的控件连接到什么:
但这个菜单不仅仅用于检查我们已经连接的内容。从这里,我们可以将任何其他操作连接到我们现有的@IBAction 方法,只需单击圆圈并拖动到现有方法即可。
因此,如果我们停止按下按钮,我们显然希望标签消失,这是一种正常的触摸,就像您连接任何其他按钮一样。剩下的唯一问题是,你想要什么确切的行为?
如果你想让标签只在手指抬起时才消失,不管手指走到哪里,那我们也要勾上“touch up outside”。
如果您希望标签在用户将手指从按钮上移开时消失,那么我们应该连接“触摸拖动退出”动作。
我们可能还想连接“触摸取消”动作,如果某种系统事件(可能是来电)取消触摸,就会发生这种情况。
This Stack Overflow answer 详细说明了我们拥有的操作选项之间的差异,因此您可以完全按照自己的需要设计行为。
无论如何,一旦我们决定了哪些操作要连接到哪些方法,请调出右键菜单并从圆圈中单击并拖动到方法:
【讨论】:
最简单的做法是向 touchDown 事件添加一个操作,并为 touchUpInside 和 touchUpOutside 添加一个单独的操作。
在 touchDown 动作上显示标签并在 touchUpInside / touchUpOutside 动作上隐藏它。 (为了完整起见,在 touchCancel 上,正如 nhgrif 在他非常彻底的回答中所建议的那样。)
在这种情况下,长按手势识别器将不起作用。您可以创建一个自定义手势识别器,在触摸时触发一个事件,在释放时触发另一个事件,然后使用它。其实做起来没那么难。
我刚刚将一个名为“MorphingButton”(链接)的演示项目上传到 GitHub,这是我在 Stack Overflow 上为另一个问题创建的。
该项目现在在触摸应用按钮时显示标签,并在您释放按钮时隐藏标签。
该项目是一个混合 Swift/Objective-C 项目,展示了如何在两种语言中进行按钮变形和标签显示/隐藏。它有一个带有 Swift 选项卡和一个 Objective-C 选项卡的选项卡栏。
【讨论】: