处理UILabel中的触摸事件并将其连接到IBAction

wfb*_*ale 100 iphone interface-builder uilabel touch-event ios

好的,所以我UILabel在界面构建器中创建了一些显示"tap to begin"的默认文本.

当用户点击UILabel我想要它触发IBAction方法时: -(IBAction)next;它更新标签上的文字以说出新的东西.
如果这允许我简单地将连接从我的方法拖到我的标签然后选择内部触摸,就像按钮一样,那将是非常方便的.但是,唉,没有雪茄.

所以无论如何,我想我的问题是,我是否必须继承UILabel才能使其工作?或者是否有某种方法可以在标签上拖动按钮,但使其为0%不透明.或者是否有一个我想念的更简单的解决方案?

Sco*_*ger 253

看看这个:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];
Run Code Online (Sandbox Code Playgroud)

诀窍是启用用户交互.


Rem*_*ver 70

UILabel继承自UIReeponder继承的UIView.所有UIresponder对象都可以处理触摸事件.所以在您的类文件中知道您的视图(包含UIlabel)实现:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
Run Code Online (Sandbox Code Playgroud)

在界面构建器中设置UILabel的标记值.当touchesBegan方法中出现触摸时,请检查标记所属视图的标记值:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";
Run Code Online (Sandbox Code Playgroud)

通过使用IBOutlet前缀声明UILabel实例变量,将类文件中的代码与接口构建器中的UILabel对象连接:

IBOutlet UILabel *label;
Run Code Online (Sandbox Code Playgroud)

然后在界面构建器中,您可以连接它们.

  • 请注意,您必须确保在界面构建器中选中"已启用用户交互",否则这将无效. (31认同)
  • 不需要标签的类似方法是简单地检查touch.view是否等于您为标签设置的插座.我更喜欢这个,因为这意味着我不必跟踪标签. (4认同)

Eik*_*iko 30

您可以使用UIButton,使其透明,即没有图像的自定义类型,并在其上添加UILabel(居中).然后连接正常的按钮事件.

  • 让人惊讶.与此线程中的其他解决方案相比,这是一个hack.如果要识别标签上的点按手势,请在标签上使用点按手势识别器.(看看它的内容是什么意思?) (10认同)
  • +1,好看又简单.我之前尝试过这个,通过设置一个不正常的opactiy 0的正常按钮,但是将类型更改为自定义的提示工作完美. (2认同)

小智 16

斯威夫特3

你有一个IBOutlet

@IBOutlet var label: UILabel!
Run Code Online (Sandbox Code Playgroud)

您可以在其中启用用户交互并添加手势识别器

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)
Run Code Online (Sandbox Code Playgroud)

最后,处理水龙头

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}
Run Code Online (Sandbox Code Playgroud)

  • 我不得不将@objc添加到userDidTapLabel以使其工作.可能是一个快速的4件事. (2认同)