iOS UIButton – UIButton setUserInteractionEnabled和setEnabled之间的区别

等待!!!:
我知道你可能会认为这个问题已经被问及过几次。 但我可以向你保证 ,这个问题是独一无二的。

题:
在iOS应用程序中,假设有两个button,如下图所示,它们有两个动作,其行为类似于切换逻辑。

在这里输入图像说明

它的逻辑可能如下:

- (IBAction)testBtnClicked:(id)sender { if ([self.testBtn isEnabled]) { [self.testBtn setEnabled:NO]; [self.setInteractionBtn setUserInteractionEnabled:YES]; } else { [self.testBtn setEnabled:YES]; [self.setInteractionBtn setUserInteractionEnabled:NO]; } } - (IBAction)setInteractionBtnClicked:(id)sender { if ([self.setInteractionBtn isEnabled]) { [self.setInteractionBtn setUserInteractionEnabled:NO]; [self.testBtn setEnabled:YES]; } else { [self.setInteractionBtn setUserInteractionEnabled:YES]; [self.testBtn setEnabled:NO]; } } 

所以我没有看到setEnabled方法和setUserInteractionEnabled方法之间有很大的区别。 它们的行为就像阻止用户不让其使用的单一方法一样。 但是,如果它是相同的,即使setUserInteractionEnabled设置为False ,我们如何能够检测isEnabled truefalse

以下是使这个问题不可能重复另一个问答线程的原因:

  • 尽pipe一些排名很高的代码可能会将我的问题标记为可能的重复,但问答并没有给我正确的理解。
  • 正如@丹说的,

    至less有一个原因是,在animation过程中,用户交互在UIViews上被禁用。 如果控件在animation时将自己画成灰色,那将是错误的。 所以至less在animation中,这两个属性有着不同的含义。 给我真正的答案或理由看到,这两种方法是有两个原因。 因为任何人都可以说setUserInteractionEnabled不会对UI状态进行更改,但至less只有在@ danh的回答中第一次表明它可能会在UIanimation期间隐式使用。

他们几乎是一样的。 userInteractionEnabledUIView一个属性,用于切换视图是否接收到任何用户触摸。 enabledUIControl (它是UIView的子类和UIButton的超类)的属性,具有相同的效果。 一个区别是,UIKit控件可能根据其enabled状态不同地绘制自己,而抽象UIView则不是这样。

好的,那为什么?

由于UIControl子类inheritance了两个,为什么有两个几乎相同的属性? 为什么控件不放弃“启用”的想法,并根据自己的userInteractionEnabled状态自行绘制?

至less有一个原因是,在animation过程中,用户交互在UIView上是禁用的。 如果控件在animation时将自己画成灰色,那将是错误的。 所以至less在animation中,这两个属性有着不同的含义。

启用的特征

  • 这是UIControl的财产
  • UIButton超类。
  • 它对物体的视觉状态有影响,并且通常是禁用控制的首选方法

userInteractionEnabled的特征

  • UIView一个属性
  • 与您的控件交互的代码更可能检查是否enabled了button,而不是如果设置了它们的userInteractionEnabled属性。 这更传统。
 @property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled 

一个布尔值,用于确定用户事件是否被忽略并从事件队列中移除。 设置为NO时,用于视图的用户事件(如触摸和键盘)将被忽略并从事件队列中移除。 当设置为YES时,事件正常传递到视图。 该属性的默认值是YES。

讨论:

在animation过程中,无论此属性中的值如何,用户交互都将暂时停用在animation所涉及的所有视图中。 您可以通过在configurationanimation时指定UIViewAnimationOptionAllowUserInteraction选项来禁用此行为。

苹果Doc在UIView

 @property(nonatomic, getter=isEnabled) BOOL enabled 

一个布尔值,确定是否启用接收器。

讨论:

指定YES以启用控制; 否则,指定NO使其禁用。 默认值是YES。 如果启用状态为“否”,控件将忽略触摸事件,而子类可能会以不同方式绘制。

供你参考:

  1. 在UIControl上的Apple Doc
  2. SO Q&A

正如@丹说:

“至less有一个原因,就是在animation制作过程中,用户交互在UIViews上是禁用的,控件在animation的时候将自己变成灰色是错误的,所以至less在animation中这两个属性的含义是不同的。