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

iOS UIButton - Difference between UIButton setUserInteractionEnabled and setEnabled

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

问题:
在一个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 方法有什么大的区别。它们的行为就像一个阻止用户不让使用它的单一方法。但是,如果相同,即使 setUserInteractionEnabled 设置为 False,我们如何能够检测到 isEnabled truefalse

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

At least one reason is that during animation, user interaction is disabled on UIViews. It would be wrong for controls to draw themselves as greyed out while they are animated. So at least during animation, the two properties have distinct meanings.

给了我真正的答案或原因,看到这两种方法是出于两个原因。因为任何人都可以说 setUserInteractionEnabled 不会对 UI 状态进行更改,但至少只有 @danh 的回答首先声明它可能在 UI 动画期间隐式使用。

启用的特征:

  • 这是 属性 的 UIControl
  • UIButton 的超类。
  • 对物体的视觉状态有影响,一般是 禁用控件的首选方法

userInteractionEnabled 的特性:

  • 属性 个 UIView
  • 与您的控件交互的代码更有可能检查是否 按钮是 enabled 而如果它们的 userInteractionEnabled 属性 是 放。比较常规。

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

则不是这种情况

好的,那为什么呢?

既然UIControl子类继承了两者,为什么会有两个几乎相同的属性?为什么控件不放弃 "enabled" 的想法并根据它们的 userInteractionEnabled 状态绘制不同的自己?

至少一个原因是在动画期间,用户交互在 UIView 上被禁用。控件在动画时将自己绘制为灰色是错误的。所以至少在动画过程中,这两个属性具有不同的含义。

@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled

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

讨论:

在动画期间,无论此 属性 中的值如何,动画中涉及的所有视图都会暂时禁用用户交互。您可以通过在配置动画时指定 UIViewAnimationOptionAllowUserInteraction 选项来禁用此行为。

Apple Doc on UIView

@property(nonatomic, getter=isEnabled) BOOL enabled

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

讨论:

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

供您参考:

  1. Apple Doc on UIControl
  2. SO Q&A

正如@danh 所述:

"At least one reason is that during animation, user interaction is disabled on UIViews. It would be wrong for controls to draw themselves as greyed out while they are animated. So at least during animation, the two properties have distinct meanings."