14

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

问题:
在 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 并没有给我正确的理解。
  • 正如@danh 所说,

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

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

4

3 回答 3

17

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

好吧,那为什么?

既然UIControl子类都继承了两者,为什么会有两个几乎相同的属性呢?为什么控件不放弃“启用”的想法并根据userInteractionEnabled状态以不同的方式绘制自己?

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

于 2015-12-04T05:11:15.430 回答
4

启用的特点:

  • 这是一个属性UIControl
  • 的超类UIButton
  • 它对对象的视觉状态有影响,通常是禁用控件的首选方法

userInteractionEnabled的特点:

  • 的财产UIView
  • 与控件交互的代码更有可能检查按钮是否设置,而enabled不是设置它们的userInteractionEnabled属性。它更传统。
于 2015-12-04T05:07:40.140 回答
1
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled

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

讨论:

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

UIView 上的 Apple 文档

@property(nonatomic, getter=isEnabled) BOOL enabled

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

讨论:

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

供你参考:

  1. UIControl 上的 Apple 文档
  2. 问答

正如@danh 所说:

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

于 2015-12-04T10:20:11.803 回答