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
true
或false
?
以下是使这个问题不可能重复另一个问答线程的原因:
- 尽pipe一些排名很高的代码可能会将我的问题标记为可能的重复,但问答并没有给我正确的理解。
- 正如@丹说的,
至less有一个原因是,在animation过程中,用户交互在UIViews上被禁用。 如果控件在animation时将自己画成灰色,那将是错误的。 所以至less在animation中,这两个属性有着不同的含义。 给我真正的答案或理由看到,这两种方法是有两个原因。 因为任何人都可以说
setUserInteractionEnabled
不会对UI状态进行更改,但至less只有在@ danh的回答中第一次表明它可能会在UIanimation期间隐式使用。
他们几乎是一样的。 userInteractionEnabled
是UIView
一个属性,用于切换视图是否接收到任何用户触摸。 enabled
是UIControl
(它是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。 如果启用状态为“否”,控件将忽略触摸事件,而子类可能会以不同方式绘制。
供你参考:
- 在UIControl上的Apple Doc
- SO Q&A
正如@丹说:
“至less有一个原因,就是在animation制作过程中,用户交互在UIViews上是禁用的,控件在animation的时候将自己变成灰色是错误的,所以至less在animation中这两个属性的含义是不同的。