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

Posted

技术标签:

【中文标题】iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别【英文标题】:iOS UIButton - Difference between UIButton setUserInteractionEnabled and setEnabled 【发布时间】:2015-12-04 04:55:28 【问题描述】:

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

问题: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,我们如何才能检测到isEnabledtruefalse

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

尽管某些排名靠前的代码可能已将我的问题标记为可能重复,但 Q&A 并没有给我正确的理解。 正如@danh 所说,

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

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

【问题讨论】:

Which is better, setEnabled or setUserInteractionEnabled?的可能重复 其实不是。因为它要求他知道不同之处,而该问卷只需要知道两者之间哪个更好。但我的问题是我需要知道确切的区别是什么以及使用哪一个。希望你能理解这是两个不同的问题。 :-) 【参考方案1】:

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

好的,那为什么?

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

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

【讨论】:

还有一点,假设您有一个按钮,并且您正试图以编程方式更改该按钮的 isSelected 属性,例如因为您有两个按钮 bg 的差异图像。现在,如果您将 button.isEnabled 设置为 false,然后尝试更改 button.isSelected ,它将无法正常工作。但是,如果您这样做,请按一下。 isuserInteractionEnabled = false 并尝试设置 iselcted 属性,它将正常工作。【参考方案2】:

启用的特点:

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

userInteractionEnabled 的特性:

UIView 的属性 与控件交互的代码更有可能检查是否 按钮是enabled,而不是它们的userInteractionEnabled 属性是 放。它更传统。

【讨论】:

【参考方案3】:
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled

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

讨论:

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

Apple Doc on UIView

@property(nonatomic, getter=isEnabled) BOOL enabled

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

讨论:

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

供您参考:

    Apple Doc on UIControl SO Q&A

正如@danh 所说:

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

【讨论】:

以上是关于iOS UIButton - UIButton setUserInteractionEnabled 和 setEnabled 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

更新标题时如何防止UIButton闪烁

ios11--UIButton

iOS UIButton的基本使用

IOS开发之XCode学习003:UIButton基础

IOS UIButton常用属性

在 iOS 中的 UIButton 上方创建叠加层?