iOS UIButton - UIButton setUserInteractionEnabled和setEnabled的区别

14

等一下!!!:
我知道你可能认为这个问题之前已经被问答多次了。但是我可以保证,这个问题是独一无二的。

问题:
在一个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方法之间没有太大的区别。它们的行为类似于一个阻止用户使用的单个方法。然而,如果它们非常相似,那么即使将setUserInteractionEnabled设置为False,我们怎么能检测isEnabled的状态是true还是false呢?

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

  • 尽管一些高排名的代码可能已经将我的问题标记为可能重复,但那个Q&A并没有给我正确的理解。
  • 正如@danh所说的那样:

至少有一个原因是在动画期间,在UIView上禁用了用户交互。当控件在动画时以灰色显示时是错误的。因此,在动画期间,这两个属性具有不同的含义。

这给了我真正的答案或者是理由来看到这两个方法是为了两个不同的原因。因为任何人都可以说setUserInteractionEnabled不会改变UI状态,但只有@danh的答案首先指出它可能隐式地在UI动画期间使用。


1
可能是Which is better, setEnabled or setUserInteractionEnabled?的重复问题。 - HDdeveloper
实际上并不是。因为它在询问他是否知道区别,而问卷只需要知道哪个更好。但我的问题是我需要知道确切的区别和应该使用哪一个。希望您能理解这是两个不同的问题。 :-) - Randika Vishman
3个回答

17
它们几乎是一样的。userInteractionEnabledUIView 的一个属性,用于切换视图是否接收任何用户触摸事件。而enabled则是 UIControl 的一个属性(它是UIView的子类和UIButton的超类),并具有相同的效果。其中一个区别在于UIKit控件可能根据其enabled状态以不同方式绘制自己,而这对于抽象的UIView则不是这种情况。
好的,那么为什么呢?由于UIControl子类都继承了这两个属性,为什么还要存在两个几乎相同的属性?为什么控件不仅仅使用"enabled"的概念,根据其userInteractionEnabled状态绘制不同的界面呢?
至少有一个原因是在动画期间,UIView上禁用了用户交互。控件在进行动画时将自己绘制成灰色是不合适的。因此,在动画期间,这两个属性具有不同的含义。

1
还有一个重要的点,假设您有一个按钮,并且您正在尝试以编程方式更改该按钮的isSelected属性,比如因为您有两个不同的按钮背景图像。现在,如果您将button.isEnabled设置为false,然后尝试更改button.isSelected,则不起作用。 但是,如果您将button.isUserInteractionEnabled = false,并尝试设置isselcted属性,则它将起作用。 - Rana

4

enabled的特点:

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

userInteractionEnabled的特点:

  • UIView的属性。
  • 与您的控件交互的代码更可能检查按钮是否enabled,而不是设置其userInteractionEnabled属性。这是更传统的做法。

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 正如@danh所述:
“至少有一个原因是,在动画期间,UIView上的用户交互被禁用。在它们动画时将控件绘制为灰色是错误的。因此,在动画期间,这两个属性具有不同的含义。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接