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

时间:2015-12-04 04:55:29

标签: ios objective-c uibutton isenabled setuserinteractionenabled

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

问题:
在iOS应用中,想象一下有两个按钮,如下图所示,它们有两个动作就像一个切换逻辑。

enter image description here

它的逻辑可能如下:

- (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 setUserInteractionEnabledFalse

以下原因使得问题无法与SO中的另一个Q& A线程重复:

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

    至少有一个原因是在动画期间,用户交互是   在UIViews上禁用。控件自我绘制是错误的   在动画时变得灰暗。所以至少在动画期间,   这两个属性有不同的含义。   给我真正的答案或原因,看出这两种方法有两个原因。因为任何人都可以说setUserInteractionEnabled没有对UI状态进行更改,但至少只有@ danh的回答才首先声明它可能会在UI动画中隐式使用。

3 个答案:

答案 0 :(得分:13)

它们几乎相同。 userInteractionEnabledUIView的属性,用于切换视图是否接收任何用户触摸。 enabledUIControl的属性(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选项来禁用此行为。

Apple Doc on UIView

@property(nonatomic, getter=isEnabled) BOOL enabled

确定接收器是否已启用的布尔值。

<强>讨论:

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

供参考:

  1. Apple Doc on UIControl
  2. SO Q&A
  3. 正如@danh所述:

      

    “至少有一个原因是在动画期间,用户互动是   在UIViews上禁用。控件自我绘制是错误的   在动画时变得灰暗。所以至少在动画期间,   这两个属性有不同的含义。“