等等!!!:
我知道你可能会认为这个问题已经被问过几次了。但我可以保证你这个问题是独一无二的。
问题:
在iOS应用中,想象一下有两个按钮,如下图所示,它们有两个动作就像一个切换逻辑。
它的逻辑可能如下:
- (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
方法之间没有太大区别。它们的行为类似于阻止用户不使用它的单一方法。但是,如果它是相同的,即使isEnabled
设置为true
,我们如何才能检测到false
setUserInteractionEnabled
或False
?
以下原因使得问题无法与SO中的另一个Q& A线程重复:
至少有一个原因是在动画期间,用户交互是 在UIViews上禁用。控件自我绘制是错误的 在动画时变得灰暗。所以至少在动画期间, 这两个属性有不同的含义。 给我真正的答案或原因,看出这两种方法有两个原因。因为任何人都可以说
setUserInteractionEnabled
没有对UI状态进行更改,但至少只有@ danh的回答才首先声明它可能会在UI动画中隐式使用。
答案 0 :(得分:13)
它们几乎相同。 userInteractionEnabled
是UIView
的属性,用于切换视图是否接收任何用户触摸。 enabled
是UIControl
的属性(UIView
的子类和UIButton
的超类),具有相同的效果。一个区别是UIKit控件可能会根据其enabled
状态而有所不同,而摘要UIView
则不然。
好的,为什么?
由于UIControl
子类继承了两者,为什么有两个几乎相同的属性?为什么控件不会放弃“启用”的概念,并根据userInteractionEnabled
状态以不同方式绘制自己?
至少有一个原因是在动画期间,UIView
上禁用了用户交互。控件在动画时将自己画成灰色是错误的。所以至少在动画期间,这两个属性具有不同的含义。
答案 1 :(得分:3)
启用的特征:
UIControl
UIButton
的超类。userInteractionEnabled:
的特征UIView
enabled
,而不是userInteractionEnabled
属性
组。它更传统。答案 2 :(得分:1)
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled
一个布尔值,用于确定是否忽略用户事件并从事件队列中删除。 设置为NO时,将忽略用于视图的用户事件(如触摸和键盘),并将其从事件队列中删除。设置为YES时,事件将正常传递到视图。此属性的默认值为YES。
<强>讨论:强>
在动画期间,无论此属性中的值如何,都会暂时禁用动画中涉及的所有视图的用户交互。您可以通过在配置动画时指定UIViewAnimationOptionAllowUserInteraction选项来禁用此行为。
@property(nonatomic, getter=isEnabled) BOOL enabled
确定接收器是否已启用的布尔值。
<强>讨论:强>
指定YES以启用控件;否则,指定NO以禁用它。默认值为YES。如果启用状态为NO,则控件忽略触摸事件,子类可能以不同方式绘制。
供参考:
正如@danh所述:
“至少有一个原因是在动画期间,用户互动是 在UIViews上禁用。控件自我绘制是错误的 在动画时变得灰暗。所以至少在动画期间, 这两个属性有不同的含义。“